본문 바로가기
알고리즘/백준

[C++] 백준 6064번 : 카잉 달력

by 컴공맨 2020. 4. 16.
 

6064번: 카잉 달력

문제 최근에 ICPC 탐사대는 남아메리카의 잉카 제국이 놀라운 문명을 지닌 카잉 제국을 토대로 하여 세워졌다는 사실을 발견했다. 카잉 제국의 백성들은 특이한 달력을 사용한 것으로 알려져 있다. 그들은 M과 N보다 작거나 같은 두 개의 자연수 x, y를 가지고 각 년도를 와 같은 형식으로 표현하였다. 그들은 이 세상의 시초에 해당하는 첫 번째 해를 <1:1>로 표현하고, 두 번째 해를 <2:2>로 표현하였다. 의 다음 해를 표현한 것을 이라고 하자. 만일

www.acmicpc.net


문제


풀이

만약, 3 5 3 4 이라고 입력을 받았으면 M = 3, N = 5이고, 찾고자 하는 k번째 해인 <x : y>는 <3 : 4> 가 되므로

 

1) <1, 1>

2) <2, 2>

3) <3, 3>

4) <1, 4>

5) <2, 5>

6) <3, 1>

7) <1, 2>

8) <2, 3>

9) <3, 4>

       ···   

 

와 같이 진행된다.

 

이때, M = 3, N = 5 이므로 x는 3칸 마다, y는 5칸마다 반복된다.

즉, x가 3이되는 위치는 3), 6), 9) 이고 M에 입력받은 크기인 3개씩 건너뛴 위치가 된다.

 

이를 식으로 만들어보면 <i % M : i % N> = <x : y>와 같은 의미가 된다.

 

그러므로 반복할때마다 i를 m만큼 증가시키고 i % n == y 가 될 때의 i가 찾고자 하는 k번째 해가 된다.


문제점

처음 제출했을때 위의 방법대로 해서 제출을 하였는데 틀렸다는 결과가 나왔다.

그래서 원인을 파악해보니 자기자신과 자기 자신을 나머지 연산을 할 경우 0이 되어버려 문제가 발생한 것이었다.

해결방법은 반복문에 들어가기전 먼저 x, y에 -1을 하고 k번째 해를 찾고 난 후 i를 출력할 때에 i에다 +1을 해주면 구하고자 하는 값이 정상적이게 나오게 된다.

 

두 번째 제출 때도 분명 나머지 연산 결과가 0이 되는 문제도 해결했는데 틀렸다는 결과가 나왔다.

확인을 해본 결과 해가 없다면 -1을 출력하는 if 문에서 check 변수를 써야 하는걸 true로 써놔서 무조건 -1이 출력돼서 나온 어처구니없는 실수였다...

 

제출 전에 디버깅은 필수...


코드

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
31
32
33
34
35
36
37
38
#include <iostream>
using namespace std;
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
 
    int t;
    int m, n, x, y;
 
    cin >> t;
 
    while (t--)
    {        
        bool check = true;
        cin >> m >> n >> x >> y;
       
        x -= 1;
        y -= 1;
 
        for (int i = x; i < (n * m); i += m)
        {
            if (i % n == y)
            {
                cout << i + 1 << "\n";
                check = false;
                break;
            }
        }
        if (check)
        {
            cout << -1 << "\n";
        }
    }
}
 
 

결과


 

 

pyo7410/Study

Contribute to pyo7410/Study development by creating an account on GitHub.

github.com