티스토리 뷰
반응형
🔢 백준 1476번 "날짜 계산" — 주기 순환 시뮬레이션으로 푸는 방법
세 개의 달력이 서로 다른 주기로 돌아간다면,
언제 셋이 동시에 다시 시작점을 맞추게 될까요?
이 문제는 단순한 조건 반복이지만, 가장 직관적인 반복 시뮬레이션 방식으로 쉽게 풀 수 있습니다.
📘 문제 설명 요약
문제 링크: https://www.acmicpc.net/problem/1476
달력에는 다음과 같은 3개의 수가 존재합니다.
- E: 지구의 연도 (1 ~ 15)
- S: 태양의 연도 (1 ~ 28)
- M: 달의 연도 (1 ~ 19)
세 수 (E, S, M)
이 주어졌을 때,
해당 연도가 처음으로 동시에 일치하는 가장 빠른 연도를 구하는 문제입니다.
💡 접근 아이디어
이 문제는 사실상 세 개의 독립적인 주기를 갖는 숫자가 한꺼번에 맞춰지는 최소 시점을 구하는 문제입니다.
어떤 복잡한 수학을 적용하지 않아도, 단순하게 세 값을 하나씩 증가시키며 비교하는 방식으로 해결 가능합니다.
즉:
- 처음은
(1, 1, 1)
에서 시작 - 매년 E, S, M은 각자의 주기에 따라 1씩 증가
- E > 15 → 1로, S > 28 → 1로, M > 19 → 1로 돌아감
- 이 과정을 반복하다가 입력값
(E, S, M)
과 일치하는 시점을 찾으면 종료
✅ 최종 파이썬 코드
E, S, M = map(int, input().split())
E1, S1, M1 = 1, 1, 1
year = 1
while (E1 != E) or (S1 != S) or (M1 != M):
E1 += 1
S1 += 1
M1 += 1
if E1 > 15:
E1 = 1
if S1 > 28:
S1 = 1
if M1 > 19:
M1 = 1
year += 1
print(year)
🧩 코드 구조 설명
1. 입력 받기
E, S, M = map(int, input().split())
공백 기준으로 세 수 입력 받기
2. 시작값 초기화
E1, S1, M1 = 1, 1, 1
year = 1
날짜는 항상 (1, 1, 1)
에서 시작
year는 경과 연도 (정답) 저장용
3. while 루프: 목표가 될 때까지 반복
while (E1 != E) or (S1 != S) or (M1 != M):
세 값 중 하나라도 다르면 반복
모두 같아지면 멈춤
4. 주기 증가 및 되감기
E1 += 1
S1 += 1
M1 += 1
if E1 > 15: E1 = 1
if S1 > 28: S1 = 1
if M1 > 19: M1 = 1
한 해가 지나면 E, S, M 각각 1씩 증가
주기 넘으면 다시 1부터 시작
5. 연도 증가
year += 1
루프 1번 돌 때마다 1년 경과
✅ 예시 입력/출력
입력:
1 16 16
출력:
16
(1, 1, 1)
에서 시작
15년 지나면 E는 다시 1, S와 M은 16에 도달
총 16년째 되는 해에 조건 만족
🔍 핵심 포인트 요약
항목 | 설명 |
---|---|
문제유형 | 반복문, 주기성, 조건 비교 |
시간복잡도 | O(N), 최악 15×28×19 = 7980 |
핵심로직 | 세 수 각각을 반복 증가 → 비교 |
쉬운 풀이 | 직접 순회하며 맞을 때까지 반복 |
✅ 마무리
이 문제는 복잡한 수학 없이도 풀 수 있는 단순한 순환 시뮬레이션 문제입니다.
가장 중요한 점은 세 수가 각기 다른 주기를 가진다는 것이고, 이를 정확하게 증가 → 되돌리기 규칙으로 처리하면 됩니다.
초보자에게는 반복문과 조건 비교 연습으로도 매우 좋은 문제입니다.
추가로 이 문제는 세 수의 최소 공통시점이라는 수학적인 주제와도 연결되니, 다음 단계에서 최소공배수(LCD) 접근법도 도전해보시길 추천드립니다.
반응형
'백준 스터디' 카테고리의 다른 글
백준 4963번, 섬의 개수 — C++ 풀이 (0) | 2025.06.26 |
---|---|
백준 10974번: 모든 순열 풀이 C++ (0) | 2025.06.26 |
백준 1439번 "뒤집기" — 파이썬으로 푸는 2가지 방법 (0) | 2025.06.18 |
백준 1439번 '뒤집기' C++ 개선 (0) | 2025.06.18 |
백준 1439번 문제 '뒤집기' C++ (0) | 2025.06.18 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 알고리즘기초
- C++
- 코딩
- c++알고리즘
- 그리디
- 코딩테스트
- 문제풀이
- 문자열처리
- 알고리즘 문제풀이
- 그리디알고리즘
- 동적 계획법
- 코딩 테스트
- python 알고리즘
- 알고리즘문제풀이
- 브루트포스
- dfs
- DP
- 프로그래밍
- 그래프 탐색
- c언어
- 문제 풀이
- 파이썬
- 백준
- 동적계획법
- 알고리즘
- 인접 행렬
- 파이썬코딩
- Python
- C++ 알고리즘
- 객체지향
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
글 보관함
반응형