알고리즘/BOJ

백준 6064번 카잉 달력

꾸준함. 2018. 8. 28. 16:58

문제 링크입니다: https://www.acmicpc.net/problem/6064


최소공배수를 이용하여 푸는 문제였습니다.


알고리즘은 아래와 같습니다.

1. 제한시간이 1초이며, M과 N이 40,000까지 주어질 수 있기 때문에 브루트 포스 형식으로는 풀 수 없는 문제였습니다.

2. M, N의 최소공배수가 멸망년도입니다.

3. 왼쪽에 주어진년도를 M으로 나누었을 때 x이여야하기 때문에 반복문 내에서 x에 M을 계속 더합니다.

4. 3번을 반복하는데 주어진 y를 만족하는 년도를 찾거나 x가 멸망년도를 초과하면 반복문에서 탈출합니다.

5. 멸망년도를 초과하면 -1을 출력하고 x, y를 만족하는 년도를 찾았다면 해당 년도를 출력합니다.


#include <iostream>

#include <algorithm>

using namespace std;

 

int M, N, x, y;

 

//최대 공약수

int GCD(int a, int b)

{

        if (a % b == 0)

                 return b;

 

        return GCD(b, a % b);

}

 

//최소 공배수

int LCM(int a, int b)

{

        return (a * b) / GCD(a, b);

}

 

int main(void)

{

        ios_base::sync_with_stdio(0);

        cin.tie(0); //실행속도 향상

        int test_case;

        cin >> test_case;

 

        for (int t = 0; t < test_case; t++)

        {

                 cin >> M >> N >> x >> y;

                

                 int maxYear = LCM(M, N);

 

                 while (1)

                 {

                         //기저사례이거나(멸망년도 벗어남)

                         //x, y를 만족하는 년도 찾음

                         if (x > maxYear || (x - 1) % N + 1 == y)

                                 break;

 

                         x += M; //M으로 나눈 나머지가 X

                 }

 

                 if (x > maxYear)

                         cout << -1 << "\n";

                 else

                         cout << x << "\n";

        }

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 1315번 RPG  (0) 2018.08.29
백준 2675번 문자열 반복  (0) 2018.08.28
백준 2292번 벌집  (0) 2018.08.28
백준 11721번 열 개씩 끊어 출력하기  (0) 2018.08.28
백준 10818번 최소, 최대  (0) 2018.08.28