📌 파이썬 으로 풀이

 

📌 문제 링크 :

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📌 문제 설명 :

한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.

한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.

 

 

📌 제한 사항

  • 3 ≤ number의 길이 ≤ 13
  • -1,000 ≤ number의 각 원소 ≤ 1,000
  • 서로 다른 학생의 정수 번호가 같을 수 있습니다.

 

📌 입출력 예


추측) 

for문을 돌려 모든 경우의 수를 비교하는 방법이 나을까 (3중포문이 걸어야 할듯한데 3중포문 피할 수 있는 방법 없나)

 

 

 

소스코드) 

* 1차) 성공 : 일단 3중 포문으로 확인 다른 방법도 생각해 보자

def solution(number):
    cnt = 0
    for i in range(len(number)):
        for x in range(i+1,len(number)):
            for y in range(x+1,len(number)) :
                if (number[i] + number[x] + number[y]) == 0 :
                    cnt += 1

    return cnt

* 2차) 성공 : 파이썬 모듈 사용해보기

# 자신만의 반복자를 만드는 모듈, 반복 요소에 대한 처리나 특정 배열에 순열이나 조합을 만들어야할 때 유용
import itertools

def solution(number):
    cnt = 0
    # 매개인자로 배열과 갯수 넣으면 해당 개수로된 모든 튜플 조합을 만든다
    data = list(itertools.combinations(number, 3))
    for one in data:
        if sum(one) == 0 : # 헉, 파이썬은 list도 그렇고 튜플도 그렇고 sum 함수에 넣어주면 합이 나옴 신기
            cnt += 1

    return cnt

* 3차)

 

 

리뷰) 

3중포문으로 풀었던 거를 다른 방법으로 풀 수 있는 방법에 대해 공부했다.

일단 파이썬의 기본 라이브러리인 itertools의 combination을 사용해 리스트에 있는 모든 조합을 구하는 걸 간단히 모듈로 대체하는 방법

다른 사람 풀이를 보니까 DFS로 푸는 방법도 있었다 이건 나중에 공부해보는 걸로

'Coding Test > Algorithm' 카테고리의 다른 글

Programmers] 카드 뭉치  (0) 2023.02.28
Programmers] [1차] 비밀지도  (0) 2023.02.28
Programmers] 개인정보 수집 유효기간  (0) 2023.02.22
Programmers] 신고 결과 받기  (0) 2023.02.22
Programmers] 둘만의 암호  (0) 2023.02.21

📌 파이썬 으로 풀이

 

📌 문제 링크 :

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📌 문제 설명 :

고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.

예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.
당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.

모든 달은 28일까지 있다고 가정합니다.

다음은 오늘 날짜가 2022.05.19일 때의 예시입니다.

  • 첫 번째 개인정보는 A약관에 의해 2021년 11월 1일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
  • 두 번째 개인정보는 B약관에 의해 2022년 6월 28일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
  • 세 번째 개인정보는 C약관에 의해 2022년 5월 18일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
  • 네 번째 개인정보는 C약관에 의해 2022년 5월 19일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.

따라서 파기해야 할 개인정보 번호는 [1, 3]입니다.

오늘 날짜를 의미하는 문자열 today, 약관의 유효기간을 담은 1차원 문자열 배열 terms와 수집된 개인정보의 정보를 담은 1차원 문자열 배열 privacies가 매개변수로 주어집니다. 이때 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 return 하도록 solution 함수를 완성해 주세요.

 

📌 제한 사항

  • today는 "YYYY.MM.DD" 형태로 오늘 날짜를 나타냅니다.
  • 1 ≤ terms의 길이 ≤ 20
    • terms의 원소는 "약관 종류 유효기간" 형태의 약관 종류와 유효기간을 공백 하나로 구분한 문자열입니다.
    • 약관 종류는 A~Z중 알파벳 대문자 하나이며, terms 배열에서 약관 종류는 중복되지 않습니다.
    • 유효기간은 개인정보를 보관할 수 있는 달 수를 나타내는 정수이며, 1 이상 100 이하입니다.
  • 1 ≤ privacies의 길이 ≤ 100
    • privacies[i]는 i+1번 개인정보의 수집 일자와 약관 종류를 나타냅니다.
    • privacies의 원소는 "날짜 약관 종류" 형태의 날짜와 약관 종류를 공백 하나로 구분한 문자열입니다.
    • 날짜는 "YYYY.MM.DD" 형태의 개인정보가 수집된 날짜를 나타내며, today 이전의 날짜만 주어집니다.
    • privacies의 약관 종류는 항상 terms에 나타난 약관 종류만 주어집니다.
  • today와 privacies에 등장하는 날짜의 YYYY는 연도, MM은 월, DD는 일을 나타내며 점(.) 하나로 구분되어 있습니다.
    • 2000 ≤ YYYY ≤ 2022
    • 1 ≤ MM ≤ 12
    • MM이 한 자릿수인 경우 앞에 0이 붙습니다.
    • 1 ≤ DD ≤ 28
    • DD가 한 자릿수인 경우 앞에 0이 붙습니다.
  • 파기해야 할 개인정보가 하나 이상 존재하는 입력만 주어집니다.

 

📌 입출력 예


추측) 

문자열인 오늘 날짜를 각각 잘라 배열로 바꾸고 datetime 타입으로 변경

privacies를 for문으로 돌려 만료기간을 나타내는 알파벳과 수집날짜를 수집하고, 이 알파벳에 맞는 달수를 찾는다.

이 달수를 수집날짜를 각자 자른것 중 달에 더해 12가 초과하면 년수를 올리고 달은 12로 나눠 계산하고 12가 초과하지 않으면 그냥 달에 더해 만료 날짜를 datetime 타입으로 만든다

일수는 기간이 달을 기준으로 하므로 계산에서는 신경쓰지 않으나 날짜 판별시에는 이 일수 이상이면 만료 판별.

오늘 날짜와 만료 날짜를 서로 비교해 오늘 날짜가 더 크면 인덱스 + 1 (몇번째것을 만료해야하는지 리턴해야하므로) 한 값을 배열에 append해 리턴 

 

소스코드) 

* 1차) 정확성 25점. 실패 케이스 7번 빼고는 런타임 에러

import datetime

def solution(today, terms, privacies):
    result = []

    today_list = today.split('.')
    today_int_list = [int(one) for one in today_list]
    today = datetime.date(today_int_list[0], today_int_list[1], today_int_list[2])

    for i in range(len(privacies)) :
        term_alphabet = privacies[i][-1]
        month = 0
        expired_date = privacies[i][0:-2]
        date = ""

        for term in terms :
            if term[0] == term_alphabet :
                month = term[2:]

        data = expired_date.split('.')
        data = [int(one) for one in data]
        plus_month = data[1] + int(month)
        if plus_month > 12 :
            data[0] = data[0]+1
            data[1] = plus_month % 12
        else :
            data[1] = plus_month

        if today >= datetime.date(data[0], data[1], data[2]) :
            result.append(i+1)

    return result

2차) 성공 : 메모리: 10.3 MB, 시간: 0.34 ms

def solution(today, terms, privacies):
    result = []
    t_year, t_month, t_day = today.split('.')

    for i in range(len(privacies)) :
        days = 0
        term_alphabet = privacies[i][-1]
        c_year, c_month, c_day = privacies[i][0:-2].split('.')

        for term in terms :
            if term[0] == term_alphabet :
                days = int(term[2:])*28

        print(days)

        diff_year = int(t_year) - int(c_year)
        diff_month = int(t_month) - int(c_month)
        diff_day = int(t_day) - int(c_day)
        diff_days = (diff_year * 28 * 12) + (diff_month * 28) + diff_day

        if diff_days >= days :
            result.append(i+1)

    return result

 

리뷰) 

첫번째에서 for문이라던가 datetime으로 바꾼다던가 하는 식 등이 들어가는 걸 다 줄여보려고 전체적 처리 방법을 바꿈.

애초에 한달이 28일로 가정하는거라 기존 datetime으로 바꿔서 비교하는것 보다는 계산식을 만드는게 맞다고 생각해서 그럼 이걸 어떤식으로 바꿀까 하다가, 만료 기간을 날짜로 표시하고, 현재 날짜 - 수집한 날짜를 계산했을 때 차이랑 비교하면 되지 않을까 싶어서 이쪽 처리로 변경

코드도 훨씬 간단 명료해짐

'Coding Test > Algorithm' 카테고리의 다른 글

Programmers] [1차] 비밀지도  (0) 2023.02.28
Programmers] 삼총사  (0) 2023.02.23
Programmers] 신고 결과 받기  (0) 2023.02.22
Programmers] 둘만의 암호  (0) 2023.02.21
Programmers] 콜라 문제  (0) 2023.02.13

📌 파이썬 으로 풀이

 

📌 문제 링크 :

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📌 문제 설명 :

신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.

  • 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
    • 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
    • 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
  • k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
    • 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.

다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다.

각 유저별로 신고당한 횟수는 다음과 같습니다.

위 예시에서는 2번 이상 신고당한 "frodo"와 "neo"의 게시판 이용이 정지됩니다. 이때, 각 유저별로 신고한 아이디와 정지된 아이디를 정리하면 다음과 같습니다.

따라서 "muzi"는 처리 결과 메일을 2회, "frodo"와 "apeach"는 각각 처리 결과 메일을 1회 받게 됩니다.

이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.

 

📌 제한 사항

  • 2 ≤ id_list의 길이 ≤ 1,000
    • 1 ≤ id_list의 원소 길이 ≤ 10
    • id_list의 원소는 이용자의 id를 나타내는 문자열이며 알파벳 소문자로만 이루어져 있습니다.
    • id_list에는 같은 아이디가 중복해서 들어있지 않습니다.
  • 1 ≤ report의 길이 ≤ 200,000
    • 3 ≤ report의 원소 길이 ≤ 21
    • report의 원소는 "이용자id 신고한id"형태의 문자열입니다.
    • 예를 들어 "muzi frodo"의 경우 "muzi"가 "frodo"를 신고했다는 의미입니다.
    • id는 알파벳 소문자로만 이루어져 있습니다.
    • 이용자id와 신고한id는 공백(스페이스)하나로 구분되어 있습니다.
    • 자기 자신을 신고하는 경우는 없습니다.
  • 1 ≤ k ≤ 200, k는 자연수입니다.
  • return 하는 배열은 id_list에 담긴 id 순서대로 각 유저가 받은 결과 메일 수를 담으면 됩니다.

 

📌 입출력 예

 


추측) 

신고 당하는 거랑은 상관없이 신고대상이 정지 됬을때 신고한 사람들에게만 처리 결과 메일을 보냄 그리고 그 수만 카운팅

따라서 신고대상자를 기준으로 신고자를 저장하고, 신고대상자 중에 정지대상자를 추려내어 그 사람을 신고한 사람들을 모두 배열로 정리한다(순서 상관없이).

그 배열안에서 id마다 메일 받을 횟수를 id 순서대로 정리해 배열로 리턴!

**** 같은 사람이 신고한 부분에 대해 신경쓸것! 

 

 

소스코드) 

* 1차) 정확도 단 8.3점 또르르

def solution(id_list, report, k):
    mail_receivers = []
    result = [ 0 for one in id_list ]
    declare_dict = {}
    for one in report:
        declare_from, declare_to = one.split(" ")
        if declare_to in declare_dict :
            declare_dict.get(declare_to).append(declare_from)
        else :
            declare_dict[declare_to] = [declare_from]

    for key, value in declare_dict.items() :
        value_list = list(set(value))
        if len(value_list) >= k :
            for one in value :
                mail_receivers.append(one)

    for receiver in mail_receivers :
        for i in range(len(id_list)) :
            if receiver == id_list[i] :
                result[i] += 1

    return result

*2차) 실패 : 단 하나의 시간초과 ㅠ

def declaration(id_list, report, k):
    mail_receivers = []
    result = [ 0 for one in id_list ]
    declare_dict = {}
    for one in report:
        declare_from, declare_to = one.split(" ")                   # 신고자와 신고대상을 나눔

        if declare_to in declare_dict :                             # 신고 내역 확인
            if declare_from not in declare_dict[declare_to] :       # 동일한 신고자는 제외
                declare_dict.get(declare_to).append(declare_from)   # 신고자 배열 가져와서 추가
        else :
            declare_dict[declare_to] = [declare_from]

    for key, value in declare_dict.items() :
        if len(value) >= k :
            for one in value :
                mail_receivers.append(one)

    for receiver in mail_receivers :
        for i in range(len(id_list)) :
            if receiver == id_list[i] :
                result[i] += 1

    return result

*3차) 성공

def solution(id_list, report, k):

    declare_dict = {}
    for one in report:
        declare_from, declare_to = one.split(" ")                   # 신고자와 신고대상을 나눔

        if declare_to in declare_dict :                             # 신고 내역 확인
            if declare_from not in declare_dict[declare_to] :       # 동일한 신고자는 제외
                declare_dict.get(declare_to).append(declare_from)   # 신고자 배열 가져와서 추가
        else :
            declare_dict[declare_to] = [declare_from]

    mail_receivers = []
    for key, value in declare_dict.items() :
        if len(value) >= k :
            mail_receivers.extend(value)

    result = []
    for id in id_list :
        result.append(mail_receivers.count(id))

    return result

 

 

리뷰) 

1차 피드백)

신고대상을 키로 만들고 신고자를 배열로 만들어 맵핑시켰는데, 중간에 신고자 배열에서 신고대상을 찾는 실수를 ;

그리고 같은 사람이 여러번 신고했을 때의 처리도 해주지 못함.

2차 피드백)

한건의 시간 초과가 있는데 메일리시버 정리할때 for문을 돌려서 append한거보다 extend로 한방에 붙이니 시간 초과 해결했다!

'Coding Test > Algorithm' 카테고리의 다른 글

Programmers] 삼총사  (0) 2023.02.23
Programmers] 개인정보 수집 유효기간  (0) 2023.02.22
Programmers] 둘만의 암호  (0) 2023.02.21
Programmers] 콜라 문제  (0) 2023.02.13
Programmers] 옹알이 (2)  (0) 2023.02.13

📌 파이썬 으로 풀이

 

📌 문제 링크 :

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📌 문제 설명 :

두 문자열 s와 skip, 그리고 자연수 index가 주어질 때, 다음 규칙에 따라 문자열을 만들려 합니다. 암호의 규칙은 다음과 같습니다.

  • 문자열 s의 각 알파벳을 index만큼 뒤의 알파벳으로 바꿔줍니다.
  • index만큼의 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아갑니다.
  • skip에 있는 알파벳은 제외하고 건너뜁니다.

예를 들어 s = "aukks", skip = "wbqd", index = 5일 때, a에서 5만큼 뒤에 있는 알파벳은 f지만 [b, c, d, e, f]에서 'b'와 'd'는 skip에 포함되므로 세지 않습니다. 따라서 'b', 'd'를 제외하고 'a'에서 5만큼 뒤에 있는 알파벳은 [c, e, f, g, h] 순서에 의해 'h'가 됩니다. 나머지 "ukks" 또한 위 규칙대로 바꾸면 "appy"가 되며 결과는 "happy"가 됩니다.

두 문자열 s와 skip, 그리고 자연수 index가 매개변수로 주어질 때 위 규칙대로 s를 변환한 결과를 return하도록 solution 함수를 완성해주세요.

 

📌 제한 사항

  • 5 ≤ s의 길이 ≤ 50
  • 1 ≤ skip의 길이 ≤ 10
  • s와 skip은 알파벳 소문자로만 이루어져 있습니다.
    • skip에 포함되는 알파벳은 s에 포함되지 않습니다.
  • 1 ≤ index ≤ 20

 

📌 입출력 예


추측) 

1. 각 알파벳을 인덱스 뒤 5개로 변환할 수 있도록 해야하는데 이건 아스키코드를 이용해서 숫자로 바꾸는 방식으로 처리

2. s의 알파벳의 숫자와 인덱스 5개 뒤의 숫자 사이에 skip이 숫자가 몇개가 포함되는지를 판단하여 포함되는 개수 만큼을 더함.

3. skip 경우 각각의 알파벳을 모두 아스키 코드 처리해 따로 배열로 만들어 판단할때 사용.

4. 알파벳 z (122) 초과하면 그 숫자에서 96을 빼고 26 (알파벳개수)으로 나눴을때 나머지를 다시 96에 더해준다. (초과 시 최대 index 20 + skip길이 10로 26으로 나누는 처리는 필요)

 

 

 

소스코드) 

* 1차) 실패. 단 5점 🤮

def solution(s, skip, index):
    sk = [ ord(one) for one in skip ]
    s_origin = [ ord(one) for one in s]
    s_plus = [ ord(one) + index for one in s]
    cnt = 0
    result = ""

    sk.sort()

    for i in range(len(s_plus)) :
        for one in sk :
            if s_origin[i] <= one <= s_plus[i]:
                cnt += 1

        sum = s_plus[i] + cnt
        if sum > 122 :
            sum = 96 + ((sum - 96) % 26)

        result += chr(sum)
        cnt = 0

    return result

2차) 성공

def solution(s, skip, index):
    alphabet = "abcdefghijklmnopqrstuvwxyz"
    result = ""

    for i in skip :
        alphabet = alphabet.replace(i,'')

    for one in s :
        result += alphabet[(alphabet.find(one) + index) % len(alphabet)]

    return result

 

리뷰) 

숫자로 해볼려다가 차라리 인덱스로 처리하는 게 빠를거 같아서 변경.

일단 skip 문자들을 다 처음부터 지우고 s의 인덱스를 skip을 지운 알파벳들 사이에서 인덱스를 찾아 거기서 5를 더한 값을 찾는다. 이때 skip들을 지운 알파벳 길이 보다 넘어가면 길이 만큼을 나누어 처음으로 돌아갈 수 있게 처리했다.

스킵을 먼저 처리하고 5씩 더한 값으로 처리하는 방식으로 풀이!!!

'Coding Test > Algorithm' 카테고리의 다른 글

Programmers] 개인정보 수집 유효기간  (0) 2023.02.22
Programmers] 신고 결과 받기  (0) 2023.02.22
Programmers] 콜라 문제  (0) 2023.02.13
Programmers] 옹알이 (2)  (0) 2023.02.13
Programmers] 햄버거 만들기  (0) 2023.02.13

📌 파이썬 으로 풀이

 

📌 문제 링크 :

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📌 문제 설명 :

오래전 유행했던 콜라 문제가 있습니다. 콜라 문제의 지문은 다음과 같습니다.

정답은 아무에게도 말하지 마세요.

콜라 빈 병 2개를 가져다주면 콜라 1병을 주는 마트가 있다. 빈 병 20개를 가져다주면 몇 병을 받을 수 있는가?

단, 보유 중인 빈 병이 2개 미만이면, 콜라를 받을 수 없다.

문제를 풀던 상빈이는 콜라 문제의 완벽한 해답을 찾았습니다. 상빈이가 푼 방법은 아래 그림과 같습니다. 우선 콜라 빈 병 20병을 가져가서 10병을 받습니다. 받은 10병을 모두 마신 뒤, 가져가서 5병을 받습니다. 5병 중 4병을 모두 마신 뒤 가져가서 2병을 받고, 또 2병을 모두 마신 뒤 가져가서 1병을 받습니다. 받은 1병과 5병을 받았을 때 남은 1병을 모두 마신 뒤 가져가면 1병을 또 받을 수 있습니다. 이 경우 상빈이는 총 10 + 5 + 2 + 1 + 1 = 19병의 콜라를 받을 수 있습니다.

 

문제를 열심히 풀던 상빈이는 일반화된 콜라 문제를 생각했습니다. 이 문제는 빈 병 a개를 가져다주면 콜라 b병을 주는 마트가 있을 때, 빈 병 n개를 가져다주면 몇 병을 받을 수 있는지 계산하는 문제입니다. 기존 콜라 문제와 마찬가지로, 보유 중인 빈 병이 a개 미만이면, 추가적으로 빈 병을 받을 순 없습니다. 상빈이는 열심히 고심했지만, 일반화된 콜라 문제의 답을 찾을 수 없었습니다. 상빈이를 도와, 일반화된 콜라 문제를 해결하는 프로그램을 만들어 주세요.

콜라를 받기 위해 마트에 주어야 하는 병 수 a, 빈 병 a개를 가져다 주면 마트가 주는 콜라 병 수 b, 상빈이가 가지고 있는 빈 병의 개수 n이 매개변수로 주어집니다. 상빈이가 받을 수 있는 콜라의 병 수를 return 하도록 solution 함수를 작성해주세요.

 

 

📌 제한 사항

  • 1 ≤ b < a  n ≤ 1,000,000
  • 정답은 항상 int 범위를 넘지 않게 주어집니다.

 

📌 입출력 예


추측) 

* 마트로 가져다 주지 못하는 나머지를 버리지 말고 변수로 저장할 필요가 있다.

* 마트가 항상 1병씩만 주는게 아니라 b병을 줄 수도 있다

 

- n % a 값을 먼저 저장 = remain 대입

- 마트에서 받아온 n / a  값을 저장 한다 = bottle

- bottle에 다시 remain 값을 더해 = n 대입 (덮어쓰기)

- n % a 값을 또 저장 = remain 대입 (덮어쓰기)

- n / a 값을 bottle에 +

- n값이 a로 나눈 몫이 1이 되지 못할때 까지 반복 > while문으로

- bottle 값 반환

 

 

소스코드) 

* 1차) 성공 : 메모리: 10.3 MB, 시간: 0.00 ms

def solution(a, b, n):
    bottle = 0

    while n / a >= 1 :
        remain = n % a
        n = (int(n / a)) * b
        bottle += n
        n = n + remain

    return bottle

 

리뷰) 

추측한대로 풀어진 문제! 추측대로 로직짜보고 성공하는 이 맛에 알고리즘 하지 😆

 

'Coding Test > Algorithm' 카테고리의 다른 글

Programmers] 신고 결과 받기  (0) 2023.02.22
Programmers] 둘만의 암호  (0) 2023.02.21
Programmers] 옹알이 (2)  (0) 2023.02.13
Programmers] 햄버거 만들기  (0) 2023.02.13
Programmers] 푸드 파이트 대회  (0) 2023.02.13

+ Recent posts