알고리즘

[BOJ] 6064 카잉 달력

졔졔311 2023. 6. 2. 18:05
728x90
반응형

https://www.acmicpc.net/problem/6064

 

6064번: 카잉 달력

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터는 한 줄로 구성된다.

www.acmicpc.net

---------------------------------------------------핵심 알고리즘--------------------------------------------

 

mathematics

 

---------------------------------------------------풀이----------------------------------------------------

 

<x:y>는 임의의 수 a, b에 대해, M*a+x = N*b+y를 만족하는 최솟값이 정답이다.

예를 들어, M=10, N=12이면,

<3:1> = 10*1+3 = 12*1+1 = 13이고,

<1:11> = 10*1+1 = 12*0+11 = 11이다.

이 값을 찾을때까지 a와 b를 증가시켜가며 찾는다.

calc_gcd()를 통해 N과 M의 최소공배수가 최대 해의 수이므로 그 값을 넘어가면 종료조건으로 두도록 했는데,

gcd를 찾는 과정 대신 N*M을 리턴하도록 간단하게 구현했음에도 큰 문제 없이 통과되었다.

#define FASTIO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>
#include <stack>
#include <limits.h>
#include <deque>

using namespace std;

int calc_gcd(int n, int m){
    return n*m;
}

// 첫 번째 해 : <1:1> 두 번째 해 : <2:2>
// <x:y>의 다음 해 = <x':y'>
// x < M이면 x' = x+1 아니면 x' = 1
// y < N이면 y' = y+1 아니면 y' = 1
// <M:N>은 마지막해를 나타냄.
// <x:y> = M*k+x = N*l+y
// M = 10, N = 12일 때,
// <1:11> = 10*k+1 = 12*l+11 = 11 => k는 1, l은 0.
// <3:1> = 10*k+3 = 12*l+1 = 13 => k는 1, l은 1.
// <10:12> = 10*k+10 = 12*l+12 = 60 => k는 5, l은 4.
int main(void){
    FASTIO;
    int T;
    cin >> T;
    while(T--){
        int M, N, x, y;
        cin >> M >> N >> x >> y;
        // k는 <x:y>가 k번째 해를 나타내는 것을 의미.
        // <x:y>에 의해 표현되는 해가 없으면(유효하지 않은 표현이면) -1 출력
        int k = 1;
        int curx = x, cury = y;
        int gcd = calc_gcd(N, M);
        while(curx != cury){
            // 유효하지 않은 값이면 종료
            if(curx > gcd || cury > gcd){
                curx = -1;
                break;
            }

            // 유효한 값을 찾아 계속하기
            if(curx < cury){
                curx += M;
            }
            else{
                cury += N;
            }
        }
        cout << curx << "\n";
    }
    return 0;
}

 

---------------------------------------------------후기----------------------------------------------------

 

<1:1>부터 끝까지 탐색하는 방식은 매우 초반에 시간초과였다.

따라서 방법을 바꿔 규칙을 찾아보았다.

 

gcd를 찾는 방법을 구현은 안 했는데, 알아두긴 하자~!!

728x90
반응형

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

[BOJ] 9019 DSLR  (2) 2023.06.06
[BOJ] 7569 토마토  (0) 2023.06.04
[BOJ] 5525 IOIOI  (1) 2023.06.02
[BOJ] 5430 AC  (0) 2023.06.02
[BOJ] 2579 계단 오르기  (0) 2023.06.02