[C++] 백준 6064번 : 카잉 달력
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