백준 문제 풀이

[백준 / 파이썬] 백준 1476번 문제 풀이: 브루트 포스 (Brute Force)

카방찐 2024. 9. 15. 11:15

날짜 계산

백준 1476번

Pixabay 로부터 입수된  Tim Treis 님의 이미지 입니다.


문제

준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다. 준규가 사는 나라에서는 수 3개를 이용해서 연도를 나타낸다. 각각의 수는 지구, 태양, 그리고 달을 나타낸다.
지구를 나타내는 수를 E, 태양을 나타내는 수를 S, 달을 나타내는 수를 M이라고 했을 때, 이 세 수는 서로 다른 범위를 가진다. (1 ≤ E ≤ 15, 1 ≤ S ≤ 28, 1 ≤ M ≤ 19)
우리가 알고있는 1년은 준규가 살고있는 나라에서는 1 1 1로 나타낼 수 있다. 1년이 지날 때마다, 세 수는 모두 1씩 증가한다. 만약, 어떤 수가 범위를 넘어가는 경우에는 1이 된다.
예를 들어, 15년은 15 15 15로 나타낼 수 있다. 하지만, 1년이 지나서 16년이 되면 16 16 16이 아니라 1 16 16이 된다. 이유는 1 ≤ E ≤ 15 라서 범위를 넘어가기 때문이다.
E, S, M이 주어졌고, 1년이 준규가 사는 나라에서 1 1 1일때, 준규가 사는 나라에서 E S M이 우리가 알고 있는 연도로 몇 년인지 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 세 수 E, S, M이 주어진다. 문제에 나와있는 범위를 지키는 입력만 주어진다.

 

출력

첫째 줄에 E S M으로 표시되는 가장 빠른 연도를 출력한다. 1 1 1은 항상 1이기 때문에, 정답이 음수가 나오는 경우는 없다.

 

 

문제 풀이


문제 접근

지구, 태양, 달의 주기는 각각 15, 28, 19이다

입력 값으로 부터 과거로 1년씩 되돌아가보자

만약에 1,16,16 이라는 값을 입력받았다고 해보면 그 전 해 는 15, 15, 15 가 될 것이다

또 그것의 전 해는 14, 14, 14가 되고 이런식으로 1, 1, 1이 되는 해를 찾을 수 있다

이때가 우리가 사용하는 연도의 1년이므로 1, 16, 16의 연도는 과거로 돌아간 횟수가 된다

따라서 1년전으로 15년 갔기때문에 1, 16, 16,의 연도는 1+15로 16년이 된다.

 

문제 해결

import sys
E, S, M = list(map(int, sys.stdin.readline().split()))

입력 처리

 

  • sys.stdin.readline().split()을 사용하여 표준 입력으로부터 E, S, M 값을 읽어온다. 각 값은 공백으로 구분되어 있다
  • list(map(int, ...))를 사용하여 문자열을 정수로 변환한 후, E, S, M에 저장한다

 

def check_end(E, S, M):
    if E == 1 and S == 1 and M == 1:
        return True
    else:
        return False

check_end: 종료 조건 검사 함수

 

  • 이 함수는 (E, S, M)이 모두 1인지 확인한다
  • 모든 값이 1일 때, 즉, 초기 1년이 되었을 때 True를 반환하고, 그렇지 않으면 False를 반환한다

 

def back_to_past(E, S, M):
    if E == 1:
        E = 15
    else:
        E -= 1
    if S == 1:
        S = 28
    else:
        S -= 1
    if M == 1:
        M = 19
    else:
        M -= 1
    return E, S, M

 

back_to_past: E,S,M 연도를 과거로 돌리는 함수

 

  • Earth의 최대값은 15, Sun의 최대값은 28, Moon의 최대값은 19이다
  • 각 값이 1일 때는 주기의 최대값으로 되돌리고, 그렇지 않으면 값을 1만큼 감소시킨다

 

count = 1
while not check_end(E, S, M):
    count += 1
    E, S, M = back_to_past(E, S, M)
print(count)

 

현재 연도 계산 및 출력

 

  • count를 1로 초기화한다. 이는 처음 연도가 1년으로 시작하기 때문이다 (위의 예시에서 1+15할때 1을 더한 이유이다)
  • while 루프를 사용하여 (E, S, M)이 모두 1이 될 때까지 반복한다
  • 각 반복마다 count를 증가시키고 back_to_past 함수를 호출하여 (E, S, M) 값을 업데이트한다
  • 종료 조건이 만족되면 count를 출력한다

 

 

제출 코드

import sys
E,S,M=list(map(int,sys.stdin.readline().split()))

def check_end(E,S,M):
    if E==1 and S==1 and M==1:
        return True
    else:
        return False
        
def back_to_past(E,S,M):
    if E==1:
        E=15
    else:
        E-=1
    if S==1:
        S=28
    else:
        S-=1
    if M==1:
        M=19
    else:
        M-=1
    return E,S,M


count=1
while not check_end(E,S,M):
    count+=1
    E,S,M=back_to_past(E,S,M)
print(count)