Original Source: https://www.acmicpc.net/problem/1476
1476번: 날짜 계산
준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다. 준규가 사는 나라에서는 수 3개를 이용해서 연도를 나타낸다. 각각의 수는 지구, 태양, 그리고 달을 나타낸다. 지구를 나타
www.acmicpc.net
문제
준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다. 준규가 사는 나라에서는 수 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이기 때문에, 정답이 음수가 나오는 경우는 없다.
사고의 흐름
- 최소공배수를 활용하면 수학적인 계산으로 풀 수 있을 것 같은데, 귀찮기도 하고 푸는 데 시간이 걸릴 것 같다.
- 대신 Brute Force로 푸는 게 좋겠다.
내가 작성한 소스코드
import sys
r = sys.stdin.readline
def year_increment(li, idx, sup):
li[idx] += 1
if li[idx] > sup:
li[idx] = 1
return
e, s, m = map(int, r().split())
calendar = [1, 1, 1]
year = 1
while calendar != [e, s, m]:
year += 1
year_increment(calendar, 0, 15)
year_increment(calendar, 1, 28)
year_increment(calendar, 2, 19)
print(year)
남이 작성한 소스코드
snowchori 님:
https://www.acmicpc.net/source/17377457
피드백
- E, S, M의 값을 모두 비교할 필요가 없다. 처음에 year 변수에 S의 값을 할당시키면, 문제의 답은 그로부터 28씩 증가하는 숫자들 중 하나일 수밖에 없다. 따라서 year 변수를 28씩 증가시키면서 Mod 연산을 이용해 해답을 찾으면 된다. E와 M에 대해서도 비슷한 논리를 도출할 수 있지만 변수를 가능한 한 크게 증가시켜야 실행 시간이 줄어들므로 S를 선택하는 것이 좋다.
'BOJ' 카테고리의 다른 글
[골드 3] 2206번: 벽 부수고 이동하기 (1) | 2022.09.24 |
---|---|
[실버 3] 15656번: N과 M (7) (0) | 2022.09.22 |
[실버 3] 15652번: N과 M (4) (0) | 2022.09.21 |
[실버 3] 15651번: N과 M (3) (0) | 2022.09.20 |
[실버 3] 15650번: N과 M (2) (1) | 2022.09.20 |