BOJ 7572 - 간지 (C++) / 나머지 연산 기초 정리

G1FTED_13·2025년 6월 6일

BOJ

목록 보기
19/20
post-thumbnail

https://www.acmicpc.net/problem/7572

최초 풀이 날짜: 2025. 06. 01

재풀이 날짜: 2025. 06. 06

#math #implementation #arithmetic

최초 풀이 (C++)


#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int N;
    cin >> N;

    int cha = N - 2013;

    // 지 구하기
    int ji = (5 + cha) % 12;
    if(ji < 0) ji += 12;
    cout << char(ji + 'A');

    // 간 구하기
    int gan = (9 + cha) % 10;
    if(gan < 0) gan += 10;
    cout << gan;
    
    return 0;
}

재풀이 (C++)


#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int N;
    cin >> N;

    int cha = N - 2013;

    // 지 구하기
    int ji = ((5 + cha) % 12 + 12) % 12;
    cout << char(ji + 'A');

    // 간 구하기
    int gan = ((9 + cha) % 10 + 10) % 10;
    cout << gan;
    
    return 0;
}

코멘트

  • 분명히 중1 때 수월히 풀었던 문제인데..지금 보니 생각할 부분이 많은 문제
  • 첫째로, 1년이 갑자년이 아니라는 점을 헷갈리지 말아야 함!
    • 문제에서도 2013년이 F9년 인 점을 이용해서 계산하라고 힌트를 주고 있음.
  • 간지를 구해야 하는 입력 N과 간지를 알고 있는 2013년과의 차이를 통해 N년의 간지를 계산하면 되는데, 코드를 잘 짜놓고 나중에 내 코드를 다시 보니 나머지 연산이 헷갈리는 것이다!
    • 이 기회를 통해 나머지 연산을 잘 정리해보기로 했다.

나머지 연산 기초

  • a % b 연산을 할 때, C와 Python 간에 연산의 결과에 차이가 생길 때가 있다. 바로 a 나 b의 부호가 음수일 때다. 아래의 예시를 통해 확인해보자.
  1. a > 0 , b>0
10 // 3
10 % 3
- - - - - - -
Python: 3, 1
C++: 3, 1

당연하게도 a와 b가 모두 양수인 경우 두 언어 모두 우리가 아는 결과와 같다.

  1. a < 0 , b>0
-10 // 3
-10 % 3
- - - - - - -
Python: -4, 2
C++: -3, -1

이 문제에서 등장하는 케이스가 되겠다. (N < 2013)
Python의 경우 나머지가 양수, C++의 경우 나머지가 음수가 나왔다.

  1. a > 0 , b<0
10 // -3
10 % -3
- - - - - - -
Python: -4, -2
C++: -3, 1

이번에는 반대로 나머지가 Python이 음수, C++이 양수였다.

  1. a < 0 , b<0
-10 // -3
-10 % -3
- - - - - - -
Python: 3, -1
C++: 3, -1

이번에는 두 언어 모두 똑같이 나머지가 음수로 나왔다.

음수 나머지에 대한 이해 + 코드 작성 팁

  • 위 예시들을 보면 알 수 있듯이, 언어에 따라 동일한 a, b에 대해서도 % 연산 결과가 다를 수 있다.
  • 보통 우리는 나머지 연산 결과가 0 이상이길 기대하지만, a와 b 중 하나가 음수이면 나머지가 음수가 될 수 있음에 유의해야 한다.

🎯 간지 문제 적용 예시

  • 2013년을 기준으로 어떤 해의 간지(간, 지)를 구하려 할 때,
    • 기준 연도와의 차이를 계산하고,
    • 이를 10과 12로 나눈 나머지를 통해 간과 지를 결정하는 아이디어를 사용했다.
  • 2013년의 ‘지’가 F(5)이므로
    • 차이가 +1인 2014년은 G(6),
    • 차이가 -5인 2008년은 A(0)이 된다.
  • 그런데 차이가 -6인 2007년의 경우,
    • (5-6) % 12는 Python에서는 11, C++에서는 -1이 되며,
    • 지는 0부터 11까지 존재하므로, 음수가 나오면 인덱스 오류가 발생할 수 있다.
    • Python 연산의 결과로 나온 11은 우리가 원하는 2007년의 ‘지‘이며, C++ 연산의 결과로 나온 -1은, 0번 인덱스보다 1칸 이전이라고 생각할 수 있다.

💡 그래서 해결책은?

  • 나머지 연산 결과가 음수일 가능성을 제거하기 위해,

    (a % b + b) % b

를 사용하면 된다.

  • 이 식은 a % b가 음수일 경우 b를 더해서 양수로 만들고,
    혹시나 b 이상이 되었을 경우 다시 % b로 조정해준다.
  • a % b의 결과가 이미 음이 아닐 경우(0 이상 b미만), b를 더해도 2b 미만이기 때문에 이 식의 결과는 여전히 a % b와 동일하다.
  • 결과적으로 이 표현은 항상 0 이상 b 미만의 값을 만들어 준다.
profile
어제보다, 더

0개의 댓글