๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ProgramSolve/Baekjoon

[BOJ] 6064๋ฒˆ - ์นด์ž‰ ๋‹ฌ๋ ฅ(JAVA)

by SooooooooS 2023. 3. 27.
728x90

๐Ÿ› ๏ธ ๋ฌธ์ œ ๐Ÿ› ๏ธ


๐Ÿ—’๏ธ ์„ค๋ช… ๐Ÿ—’๏ธ

์ค‘๊ตญ์ธ์˜ ๋‚˜๋จธ์ง€ ์ •๋ฆฌ ์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ
https://blog.joonas.io/23
 

์ค‘๊ตญ์ธ์˜ ๋‚˜๋จธ์ง€ ์ •๋ฆฌ - ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์„ค๋ช…

โ€‹์ค‘๊ตญ์ธ์˜ ๋‚˜๋จธ์ง€ ์ •๋ฆฌ(CRT; Chinese Remainder Theorem)์—ฐ๋ฆฝ ํ•ฉ๋™์‹์˜ ์œ ์ผํ•œ ํ•ด๋ฅผ ์ฐพ๋Š” ์ •๋ฆฌ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด์„œ ์„ค๋ช…๊ณผ ํ•จ๊ป˜ ์ „๊ฐœํ•˜๋Š” ๊ฒŒ ๊ฐ€์žฅ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค. ๊ฐœ๋… ์ดํ•ด๋ฅผ ์œ„ํ•ด ์—ฐ๋ฆฝ ํ•ฉ๋™์‹์ด 2๊ฐœ์ผ ๋•Œ

blog.joonas.io

 

๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•ด๋ณด๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์–ด๋ ค์›Œ์„œ ๊ตฌํ˜„ ์‹คํŒจ

๊ทธ๋ž˜์„œ ๋ฌธ์ œ ํ’€์ด ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋ถ€๋ถ„์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ธ€์„ ์ž‘์„ฑ

 

๋ฌธ์ œํ’€์ด ์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ
https://girawhale.tistory.com/10
 

[๋ฐฑ์ค€] 6064๋ฒˆ: ์นด์ž‰ ๋‹ฌ๋ ฅ - JAVA

๋ฌธ์ œ ๋งํฌ BOJ 6064๋ฒˆ: ์นด์ž‰ ๋‹ฌ๋ ฅ 6064๋ฒˆ: ์นด์ž‰ ๋‹ฌ๋ ฅ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋Š” ํ‘œ์ค€ ์ž…๋ ฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ž…๋ ฅ์€ T๊ฐœ์˜ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์ž…๋ ฅ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ T๊ฐ€ ์ฃผ

girawhale.tistory.com


 

1. ํ˜„์žฌ ์กฐ๊ฑด์—์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๋งˆ์ง€๋ง‰ ํ•ด

    ์˜ˆ๋ฅผ ๋“ค์–ด, M = 10 ์ด๊ณ  N = 12๋ผ๊ณ  ํ•˜์ž. ์ฒซ ๋ฒˆ์งธ ํ•ด๋Š” <1:1>๋กœ ํ‘œํ˜„๋˜๊ณ , 11๋ฒˆ์งธ ํ•ด๋Š” <1:11>๋กœ ํ‘œํ˜„๋œ๋‹ค. <3:1>์€ 13๋ฒˆ์งธ ํ•ด๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , <10:12>๋Š” ๋งˆ์ง€๋ง‰์ธ 60๋ฒˆ์งธ ํ•ด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

   ์œ„์™€ ๊ฐ™์ด ๋ฌธ์ œ ์˜ˆ์‹œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋งˆ์ง€๋ง‰ ํ•ด๋Š” M๊ณผ N์˜ ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜์ด๋‹ค.

   ์ฆ‰, ๋งˆ์ง€๋ง‰ ํ•ด๋ฅผ ๋„˜๊ธฐ๊ธฐ ์ „๊นŒ์ง€ ํ•ด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋‹ต ์ถœ๋ ฅ / ๋ชป ๊ตฌํ•˜๋ฉด -1 ์ถœ๋ ฅ

 

2. ํ‘œํ˜„์‹ ์ •๋ฆฌ

x < M ์ด๋ฉด x' = x + 1์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด x' = 1์ด๋‹ค. ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋งŒ์ผ y < N์ด๋ฉด y' = y + 1์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด y' = 1

   x๊ฐ€ M๋ณด๋‹ค ์ž‘์œผ๋ฉด 1์”ฉ ์ฆ๊ฐ€ํ•˜๋‹ค๊ฐ€ M๋ณด๋‹ค ํฐ ์ˆ˜๊ฐ€ ๋˜๋ฉด x๋Š” ๋‹ค์‹œ 1๋กœ ๋Œ์•„๊ฐ„๋‹ค. y๋„ x์™€ ๊ฐ™๋‹ค.

   ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋‚˜๋ˆ—์…ˆ์„ ํ•˜๊ณ  ๊ตฌํ•œ ๋‚˜๋จธ์ง€๊ฐ€ ์ด์™€ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค.

a / b = c ... d
์ด๋ฅผ ๋ง๋กœ ํ‘œํ˜„ํ•˜๋ฉด a ๋‚˜๋ˆ„๊ธฐ b์˜ ๋ชซ์€ c ์ด๊ณ  ๋‚˜๋จธ์ง€๋Š” d ์ด๋‹ค.

ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ’์œผ๋กœ ํ‘œํ˜„ํ•ด ๋ณด๋ฉด
a / M = c ... x   ---โ‘ 
a' / N = c' ... y   ---โ‘ก

์ด๋•Œ, ์ค‘์š”ํ•œ ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ•  ๊ฐ’์€ a ์™€a' ์ธ๋ฐ a = a' ์ธ ๊ฒƒ์„ ๊ตฌํ•ด์•ผํ•œ๋‹ค. (์ง€๊ธˆ๋ถ€ํ„ฐ๋Š” result๋กœ ํ‘œํ˜„ํ•œ๋‹ค.)
โ‘  result = M * c + x
โ‘ก result = N * c' + y

์ฆ‰, M * c + x = N * c' + y ์ด๋‹ค.

 

3. ์ฝ”๋“œ์— ์‚ฌ์šฉ

int last = lcm(M, N); //๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์—ฐ๋„ - ์ตœ์†Œ ๊ณต๋ฐฐ์ˆ˜๋กœ ๊ตฌํ•œ๋‹ค.
int n = 0; // M์˜ ๋ชซ
int result = -1; //๊ตฌํ•ด์•ผ ํ•  ๊ฐ’

while(n * M < last){
    if((n * M + x - y) % N == 0) {
        result = n * M + x;
        break;
    }
    n++;
}

//๊ฒฐ๊ณผ ์ €์žฅ
sb.append(result).append("\n");
  • result๋ฅผ -1๋กœ ์ดˆ๊ธฐํ™”ํ•œ ์ด์œ 
    • while๋ฌธ ์† ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜์ง€ ์•Š๊ณ  ๋๋‚˜๋ฉด <x:y> ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋Š” ์˜๋ฏธ
  • n * M < last 
    • ํ˜„์žฌ ์กฐ๊ฑด์—์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๋งˆ์ง€๋ง‰ ํ•ด(์œ„์˜ ์„ค๋ช… ์ฐธ๊ณ )
    • ๋ฌธ์ œ ์กฐ๊ฑด : 1 ≤ x ≤ M ์ด๋‹ค.
    • ์ฆ‰, last๋ณด๋‹ค ๋ฌด์กฐ๊ฑด ์ž‘์€ ์ด์œ ๋Š” n * M + x ์ด๋ฏ€๋กœ n * M ์™€ last ๊ฐ™์„ ์ˆ˜ ์—†๋‹ค.
  • n * M + x - y
    • M * n + x = N * c' + y (์œ„์˜ ์‹ ์ •๋ฆฌ ์ฐธ๊ณ ) ----(1)
    • N * c' = M * n + x - y
    • (M * n + x - y) % N == 0 ์ด๋ผ๋ฉด (1)์‹ ์„ฑ๋ฆฝํ•œ๋‹ค๋Š” ์˜๋ฏธ

๐Ÿ€ ํ’€์ด ์ฝ”๋“œ ๐Ÿ€

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ6064 {
    //์ตœ๋Œ€๊ณต์•ฝ์ˆ˜
    public static int gcd(int num1, int num2){
        int tmp = 0;
        while(num2 > 0){
            tmp = num1 % num2;
            num1 = num2;
            num2 = tmp;
        }
        return num1;
    }

    //์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜
    public static int lcm(int num1, int num2){
        return num1 * num2 / gcd(num1, num2);
    }
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

        int testcase = Integer.parseInt(bf.readLine());
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;

        for(int i = 0; i < testcase; i++){
            st = new StringTokenizer(bf.readLine());
            int M = Integer.parseInt(st.nextToken());
            int N = Integer.parseInt(st.nextToken());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());

            int last = lcm(M, N); //๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์—ฐ๋„
            int n = 0;
            int result = -1;
            while(n * M < last){
                if((n * M + x - y) % N == 0) {
                    result = n * M + x;
                    break;
                }
                n++;
            }
            sb.append(result).append("\n");
        }
        System.out.println(sb);
    }
}
728x90