백준 2502번 - 떡 먹는 호랑이(★★ / O / 1) : Python

기운찬곰·2021년 3월 13일
0

백준2

목록 보기
4/17
post-custom-banner

개요


문제

하루에 한 번 산을 넘어가는 떡 장사 할머니는 호랑이에게 떡을 주어야 산을 넘어갈 수 있는데, 욕심 많은 호랑이는 어제 받은 떡의 개수와 그저께 받은 떡의 개수를 더한 만큼의 떡을 받아야만 할머니를 무사히 보내 준다고 한다.

예를 들어 첫째 날에 떡을 1개 주었고, 둘째 날에는 떡을 2개 주었다면 셋째 날에는 1+2=3개, 넷째 날에는 2+3=5개, 다섯째 날에는 3+5=8개, 여섯째 날에는 5+8=13개를 주어야만 무사히 산을 넘어갈 수 있다.

우리는 산을 무사히 넘어온 할머니에게 오늘 호랑이에게 몇 개의 떡을 주었는지, 그리고 오늘이 호랑이를 만나 떡을 준지 며칠이 되었는지를 알아내었다. 할머니가 호랑이를 만나서 무사히 넘어온 D째 날에 준 떡의 개수가 K개임을 알 때, 여러분은 할머니가 호랑이를 처음 만난 날에 준 떡의 개수 A, 그리고 그 다음 날에 호랑이에게 준 떡의 개수 B를 계산하는 프로그램을 작성하시오. 이 문제에서는 항상 1≤A≤B 이다.

예를 들어 여섯 번째 날에 산을 무사히 넘어온 할머니가 호랑이에게 준 떡이 모두 41개라면, 호랑이를 만난 첫 날에 준 떡의 수는 2개, 둘째 날에 준 떡의 수는 7개이다. 즉 셋째 날에는 9개, 넷째 날에는 16개, 다섯째 날에는 25개, 여섯째 날에는 41개이다. 따라서 A=2, B=7 이 된다. 단 어떤 경우에는 답이 되는 A, B가 하나 이상일 때도 있는데 이 경우에는 그 중 하나만 구해서 출력하면 된다.

입력

첫째 줄에는 할머니가 넘어온 날 D (3 ≤ D ≤ 30)와 그 날 호랑이에게 준 떡의 개수 K (10 ≤ K ≤ 100,000)가 하나의 빈칸을 사이에 두고 주어진다.

출력

첫줄에 첫 날에 준 떡의 개수 A를 출력하고 그 다음 둘째 줄에는 둘째 날에 준 떡의 개수 B를 출력한다. 이 문제에서 주어진 D, K에 대해서는 항상 정수 A, B (1≤A≤B)가 존재한다.


해결방법

문제 이해하기

처음에 문제를 읽으면서 '에이.. 시시하게 피보나치 수열 문제인가?' 했는데 다 읽어보니까 살짝 변형된 문제라고 생각했다.

알고리즘

생각은 의외로 쉽게 났다. 첫번째 날 떡의 개수를 a, 두번째 날 떡의 개수를 b라고 두었을때 6번째 날까지 계산해봤더니 3a + 5b가 나왔다.

a와 b는 정해진게 없으니까 a를 1부터 넣어봐서 b로 나눠떨어지면 그게 정답이겠거니 라고 생각했다.


Python

내 코드

import sys
input = sys.stdin.readline

if __name__ == "__main__":
    d, k = map(int, input().split())

    a, b = 1, 1 # 3부터 시작하니까 뭐...
    for _ in range(4, d + 1):
        a, b = b, a + b

    # print(a, b)
    
    ac = 1
    bc = 0
    while True:
        tmp = k - a * ac
        if tmp < 0:
            break

        if tmp % b == 0:
            bc = tmp // b
            break

        ac += 1

    print(ac)
    print(bc)

✍️ 생각보다 쉽게 풀려서 뭐... 싱거운 느낌이었다.

profile
velog ckstn0777 부계정 블로그 입니다. 프론트 개발 이외의 공부 내용을 기록합니다. 취업준비 공부 내용 정리도 합니다.
post-custom-banner

0개의 댓글