문제
풀이
만약, 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";
}
}
}
|
결과
'알고리즘 > 백준' 카테고리의 다른 글
[C++] 백준 15649번 : 다음 순열 (0) | 2020.04.17 |
---|---|
[C++] 백준 15649번 : N과 M (3) (0) | 2020.04.17 |
[C++] 백준 15649번 : N과 M (2) (0) | 2020.04.17 |
[C++] 백준 15649번 : N과 M (1) (0) | 2020.04.17 |
[C++] 백준 1748번 : 수 이어쓰기 1 (0) | 2020.04.16 |