본문 바로가기

Computer Science/Algorithm

[BOJ 6064] 카잉 달력

접근 방법 : 저번에 풀었던 '날짜 계산' 문제와 유사하다. 똑같은 방법으로 풀려고 했지만 시간초과가 나서 당황했다. M과 N값의 범위가 40000이므로 처음부터 M*N 까지 탐색을 시도했다간 엄청난 연산 숫자에 시간초과가 난다. 따라서 더 효율적인 방법을 찾아야 했는데 내가 생각해낸 방법은 아래와 같다.


L번째 년도라고 했을 때  L = M*(몫) + x (주어진 x 값) 을 만족한다. 따라서 몫을 반복문을 증가시키면서 일단 x가 의미하는 L 번째 연도를 찾고 그 L번째 년도가 (L-y) / N 을 만족한다면 찾은 L 값이 정답이 된다. L의 범위는 최대 M*N을 넘지 않으므로 반복문을 M*N까지 돌려준다.


만약 L 값이 M*N 값을 넘게 되면 -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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
using namespace std;
int M, N, x, y;
 
int solve() {
    int i = 0;
    int A = 0;
    while (A <= M*N) {
        A = M*+ x;
        if ((A - y) % N == 0) { return A; }
        i++;
    }
    return -1;
}
 
int main() {
    int T;
    scanf("%d"&T);
    
    for (int i = 1; i <= T; i++) {
        
        scanf("%d %d %d %d"&M, &N, &x, &y);
        int ans = solve();
 
        printf("%d\n", ans);
    }
 
    return 0;
}
cs


반응형

'Computer Science > Algorithm' 카테고리의 다른 글

[BOJ 9095] 1, 2, 3 더하기  (0) 2018.08.13
[BOJ 1748] 수 이어 쓰기1  (0) 2018.08.09
[BOJ 14500] 테트로미노  (0) 2018.08.06
[BOJ 1107] 리모컨  (0) 2018.08.06
[BOJ 1476] 날짜 계산  (0) 2018.08.06