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


문제 접근 방식
- x나 y를 1씩 증가시키는 방식으로 진행 시 시간초과를 초래할 수 있다.
- x를 고정 시키고 출력 해를 M만큼 증가시키는 방식으로 해를 구한다.
- 증가하는 해에 대해서 %N을 이용하여 일치하는 y를 찾는다.
예를 들어 M과 N이 10, 12 이고 x와 y가 3,1일 때
<10, 12>
1번째 해 -> <1,1>
2번째 해 -> <2,2>
3번째 해 -> <3,3>
.........
10번째 해 -> <10,10>
11번째 해 -> <1,11>
12번째 해 -> <2,12>
13번째 해 -> <3,1>
13이 출력해야 할 해임을 알 수 있다.
이때 x를 고정했다고 가정하면 1번째 x==3이 일치하는 것은 3번째 해이고 그 다음은 13번재 해이다.
이는 x + M * i로 볼 수 있다. 이 때 (x + M * i )%N이 해당 년의 y값이 되므로, 구한 y값과 입력 받은 y값이 일치한다면 그 때를 답이라고 볼 수 있다.
여기서 주의해야할 점은 %를 이용하기 때문에 0부터 시작이 되므로 (M,N) 과 (x,y)가 일치할 때 문제가 생길 수 있다.
그렇기 때문에 최초 x와 y를 -1을 해준뒤 구해진 해에 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
39
40
41
|
#include <iostream>
using namespace std;
void solve(int M, int N, int x, int y)
{
x--;
y--;
for (int i = 0; i < N; i++)
{
int ans = M * i + x;
if (ans % N == y)
{
cout << ans + 1 << "\n";
return;
}
}
cout << "-1\n";
return;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int T, M, N, x, y;
cin >> T;
for (int i = 0; i < T; i++)
{
cin >> M >> N >> x >> y;
solve(M, N, x, y);
}
return 0;
}
Colored by Color Scripter
|
문제 출력이 다양하지 않으므로 반례를 준비했습니다.
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
|
15
40000 39999 39999 39998
40000 39999 40000 39999
40000 40000 40000 39999
40000 39998 40000 39997
39999 2 39998 2
3 40000 3 39999
40000 3 40000 3
8 2 4 2
10 12 2 12
12 10 12 10
12 10 1 1
12 6 12 6
10 1 5 1
1 10 1 5
1 1 1 1
답:
1599959999
1599960000
-1
-1
39998
39999
120000
4
12
60
1
12
5
5
1
|
'백준 문제풀이 > SILVER' 카테고리의 다른 글
[백준 / BOJ / SILVER 5] 1476 번 : 날짜 계산 (0) | 2020.03.04 |
---|---|
[백준 / BOJ / SILVER 3] 1748 번 : 수 이어쓰기 1 (0) | 2020.03.01 |
[백준 / BOJ / SILVER 1] 11048 번 : 이동하기 (0) | 2020.02.29 |
[백준 / BOJ / SILVER 2] 1890 번 : 점프 (0) | 2020.02.28 |
[백준 / BOJ / SILVER 2] 3184 번 : 양 (0) | 2020.02.26 |
https://www.acmicpc.net/problem/6064
6064번: 카잉 달력
문제 최근에 ICPC 탐사대는 남아메리카의 잉카 제국이 놀라운 문명을 지닌 카잉 제국을 토대로 하여 세워졌다는 사실을 발견했다. 카잉 제국의 백성들은 특이한 달력을 사용한 것으로 알려져 있다. 그들은 M과 N보다 작거나 같은 두 개의 자연수 x, y를 가지고 각 년도를 와 같은 형식으로 표현하였다. 그들은 이 세상의 시초에 해당하는 첫 번째 해를 <1:1>로 표현하고, 두 번째 해를 <2:2>로 표현하였다. 의 다음 해를 표현한 것을 이라고 하자. 만일
www.acmicpc.net


문제 접근 방식
- x나 y를 1씩 증가시키는 방식으로 진행 시 시간초과를 초래할 수 있다.
- x를 고정 시키고 출력 해를 M만큼 증가시키는 방식으로 해를 구한다.
- 증가하는 해에 대해서 %N을 이용하여 일치하는 y를 찾는다.
예를 들어 M과 N이 10, 12 이고 x와 y가 3,1일 때
<10, 12>
1번째 해 -> <1,1>
2번째 해 -> <2,2>
3번째 해 -> <3,3>
.........
10번째 해 -> <10,10>
11번째 해 -> <1,11>
12번째 해 -> <2,12>
13번째 해 -> <3,1>
13이 출력해야 할 해임을 알 수 있다.
이때 x를 고정했다고 가정하면 1번째 x==3이 일치하는 것은 3번째 해이고 그 다음은 13번재 해이다.
이는 x + M * i로 볼 수 있다. 이 때 (x + M * i )%N이 해당 년의 y값이 되므로, 구한 y값과 입력 받은 y값이 일치한다면 그 때를 답이라고 볼 수 있다.
여기서 주의해야할 점은 %를 이용하기 때문에 0부터 시작이 되므로 (M,N) 과 (x,y)가 일치할 때 문제가 생길 수 있다.
그렇기 때문에 최초 x와 y를 -1을 해준뒤 구해진 해에 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
39
40
41
|
#include <iostream>
using namespace std;
void solve(int M, int N, int x, int y)
{
x--;
y--;
for (int i = 0; i < N; i++)
{
int ans = M * i + x;
if (ans % N == y)
{
cout << ans + 1 << "\n";
return;
}
}
cout << "-1\n";
return;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int T, M, N, x, y;
cin >> T;
for (int i = 0; i < T; i++)
{
cin >> M >> N >> x >> y;
solve(M, N, x, y);
}
return 0;
}
Colored by Color Scripter
|
문제 출력이 다양하지 않으므로 반례를 준비했습니다.
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
|
15
40000 39999 39999 39998
40000 39999 40000 39999
40000 40000 40000 39999
40000 39998 40000 39997
39999 2 39998 2
3 40000 3 39999
40000 3 40000 3
8 2 4 2
10 12 2 12
12 10 12 10
12 10 1 1
12 6 12 6
10 1 5 1
1 10 1 5
1 1 1 1
답:
1599959999
1599960000
-1
-1
39998
39999
120000
4
12
60
1
12
5
5
1
|
'백준 문제풀이 > SILVER' 카테고리의 다른 글
[백준 / BOJ / SILVER 5] 1476 번 : 날짜 계산 (0) | 2020.03.04 |
---|---|
[백준 / BOJ / SILVER 3] 1748 번 : 수 이어쓰기 1 (0) | 2020.03.01 |
[백준 / BOJ / SILVER 1] 11048 번 : 이동하기 (0) | 2020.02.29 |
[백준 / BOJ / SILVER 2] 1890 번 : 점프 (0) | 2020.02.28 |
[백준 / BOJ / SILVER 2] 3184 번 : 양 (0) | 2020.02.26 |