티스토리 뷰
반응형
🔷 C++ 날짜 계산 문제: 무한루프 발생 원인과 해결까지
1️⃣ 문제
태양, 지구, 달의 연도를 각각 E(1~~15), S(1~~28), M(1~19)라 할 때,
(1,1,1)부터 시작하여 E, S, M이 모두 주어진 값과 일치하는 최초의 연도를 구하는 문제입니다.
📎 문제 링크: 백준 1476번 - 날짜 계산
2️⃣ 아이디어
각각의 값은 주기적으로 순환합니다.
- E는 15를 넘기면 다시 1
- S는 28을 넘기면 다시 1
- M은 19를 넘기면 다시 1
(1,1,1)부터 시작하여 매년 값을 하나씩 증가시키며,
각 값이 기준을 초과할 경우 1로 초기화합니다.
세 값이 모두 입력받은 (E, S, M)과 같아지는 순간을 찾습니다.
3️⃣ 전체 코드_실수편
❌ 실수 버전 코드
#include <iostream>
using namespace std;
int main(void)
{
int E, S, M, cnt = 1;
int E1 = 1, S1 = 1, M1 = 1;
cin >> E >> S >> M;
while(E1 != E && S1 != S && M1 != M) // ❌ AND 조건 오류
{
if(E1 > 15) E1 = 1;
if(S1 > 28) S1 = 1;
if(M1 > 19) M1 = 19; // ❌ 리셋 실수
E1++;
S1++;
M1++;
cnt++;
}
cout << cnt << endl;
return 0;
}
🧨 실수 요약
실수 | 설명 |
---|---|
while (E1 != E && S1 != S && M1 != M) |
세 값 중 하나라도 맞으면 루프 탈출 → 조기 종료 발생 |
if (M1 > 19) M1 = 19; |
M1이 19를 넘겨도 1로 리셋되지 않고 계속 19로 유지됨 → 무한 루프 발생 |
증가 순서 오류 | 증가 전에 초과 여부 검사 → 리셋 조건이 제대로 작동하지 않음 |
4️⃣ 개선 아이디어
while(E1 != E || S1 != S || M1 != M)
로 수정- 값을 먼저 증가시킨 후, 초과 시 1로 리셋
- M1은 초과 시
M1 = 1
로 정확히 처리
5️⃣ 전체 코드_해결편
#include <iostream>
using namespace std;
int main(void)
{
int E, S, M, cnt = 1;
int E1 = 1, S1 = 1, M1 = 1;
cin >> E >> S >> M;
while (E != E1 || S != S1 || M != M1)
{
E1++; if (E1 > 15) E1 = 1;
S1++; if (S1 > 28) S1 = 1;
M1++; if (M1 > 19) M1 = 1;
cnt++;
}
cout << cnt << endl;
return 0;
}
6️⃣ 전체 코드 분할 설명
int E, S, M, cnt = 1;
- 입력받을 목표값 E, S, M과 연도 카운터 cnt 초기화
int E1 = 1, S1 = 1, M1 = 1;
- 현재 날짜 상태를 (1, 1, 1)로 시작
cin >> E >> S >> M;
- 사용자 입력을 받아 목표 상태 설정
while (E != E1 || S != S1 || M != M1)
- 세 값 중 하나라도 다르면 계속 반복
E1++; if (E1 > 15) E1 = 1;
S1++; if (S1 > 28) S1 = 1;
M1++; if (M1 > 19) M1 = 1;
- 각 날짜 값을 1 증가시키고, 범위를 넘으면 1로 리셋
cnt++;
- 연도 수 증가
cout << cnt << endl;
- 세 값이 처음으로 일치하는 연도 출력
✅ 마무리
이번 문제는 단순한 반복문 문제처럼 보이지만,
- 루프 조건에서의 논리 오류 (
&&
vs||
) - 값 증가와 리셋 순서
- 범위 리셋 조건의 부정확성
등의 요소에서 쉽게 무한 루프에 빠질 수 있습니다.
조금만 구조와 논리를 잘못 설계해도 결과가 달라지기 때문에,
"반복 조건, 증가 순서, 범위 리셋"을 철저하게 점검하는 연습이 중요합니다.
반응형
'백준 스터디' 카테고리의 다른 글
백준 1439번 '뒤집기' C++ 개선 (0) | 2025.06.18 |
---|---|
백준 1439번 문제 '뒤집기' C++ (0) | 2025.06.18 |
백준 2468번 안전 영역 문제풀이 Python (0) | 2025.06.06 |
백준 2468번 안전 영역 문제 풀이 C++ (0) | 2025.06.06 |
백준 7568번 덩치 문제 C++ (0) | 2025.06.06 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 그리디알고리즘
- 문제풀이
- 객체지향
- C++ 알고리즘
- 코딩테스트
- 브루트포스
- 알고리즘기초
- 알고리즘 문제풀이
- 문제 풀이
- 동적계획법
- python 알고리즘
- 문자열처리
- dfs
- Python
- 그리디
- c++알고리즘
- 코딩
- DP
- 파이썬
- 프로그래밍
- c언어
- 알고리즘문제풀이
- 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 |
글 보관함
반응형