티스토리 뷰

백준 스터디

C++ 날짜 계산 문제, 백준 1476

박완희버서커 2025. 6. 17. 12:45
반응형

🔷 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 ||)
  • 값 증가와 리셋 순서
  • 범위 리셋 조건의 부정확성

등의 요소에서 쉽게 무한 루프에 빠질 수 있습니다.
조금만 구조와 논리를 잘못 설계해도 결과가 달라지기 때문에,
"반복 조건, 증가 순서, 범위 리셋"을 철저하게 점검하는 연습이 중요합니다.


반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
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
글 보관함
반응형