๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm/BOJ

[๋ฐฑ์ค€] 6064. ์นด์ž‰ ๋‹ฌ๋ ฅ

 

๐Ÿ“ช [์นด์ž‰ ๋‹ฌ๋ ฅ]

 

 

6064๋ฒˆ: ์นด์ž‰ ๋‹ฌ๋ ฅ

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

www.acmicpc.net

 


 

 

๐Ÿ“‹ ๋ฌธ์ œ์„ค๋ช…

์ตœ๊ทผ์— ICPC ํƒ์‚ฌ๋Œ€๋Š” ๋‚จ์•„๋ฉ”๋ฆฌ์นด์˜ ์ž‰์นด ์ œ๊ตญ์ด ๋†€๋ผ์šด ๋ฌธ๋ช…์„ ์ง€๋‹Œ ์นด์ž‰ ์ œ๊ตญ์„ ํ† ๋Œ€๋กœ ํ•˜์—ฌ ์„ธ์›Œ์กŒ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ์นด์ž‰ ์ œ๊ตญ์˜ ๋ฐฑ์„ฑ๋“ค์€ ํŠน์ดํ•œ ๋‹ฌ๋ ฅ์„ ์‚ฌ์šฉํ•œ ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ๋‹ค.

  • ๊ทธ๋“ค์€ M๊ณผ N๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๋‘ ๊ฐœ์˜ ์ž์—ฐ์ˆ˜ x, y๋ฅผ ๊ฐ€์ง€๊ณ  ๊ฐ ๋…„๋„๋ฅผ <x:y>์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ํ‘œํ˜„ํ•˜์˜€๋‹ค.
  • ๊ทธ๋“ค์€ ์ด ์„ธ์ƒ์˜ ์‹œ์ดˆ์— ํ•ด๋‹นํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ํ•ด๋ฅผ <1:1>๋กœ ํ‘œํ˜„ํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ํ•ด๋ฅผ <2:2>๋กœ ํ‘œํ˜„ํ•˜์˜€๋‹ค.
  • <x:y>์˜ ๋‹ค์Œ ํ•ด๋ฅผ ํ‘œํ˜„ํ•œ ๊ฒƒ์„ <x':y'>์ด๋ผ๊ณ  ํ•˜์ž. ๋งŒ์ผ x < M ์ด๋ฉด x' = x + 1์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด x' = 1์ด๋‹ค.
  • ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋งŒ์ผ y < N์ด๋ฉด y' = y + 1์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด y' = 1์ด๋‹ค.
  • <M:N>์€ ๊ทธ๋“ค ๋‹ฌ๋ ฅ์˜ ๋งˆ์ง€๋ง‰ ํ•ด๋กœ์„œ, ์ด ํ•ด์— ์„ธ์ƒ์˜ ์ข…๋ง์ด ๋„๋ž˜ํ•œ๋‹ค๋Š” ์˜ˆ์–ธ์ด ์ „ํ•ด ์˜จ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, M = 10 ์ด๊ณ  N = 12๋ผ๊ณ  ํ•˜์ž. ์ฒซ ๋ฒˆ์งธ ํ•ด๋Š” <1:1>๋กœ ํ‘œํ˜„๋˜๊ณ , 11๋ฒˆ์งธ ํ•ด๋Š” <1:11>๋กœ ํ‘œํ˜„๋œ๋‹ค. <3:1>์€ 13๋ฒˆ์งธ ํ•ด๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , <10:12>๋Š” ๋งˆ์ง€๋ง‰์ธ 60๋ฒˆ์งธ ํ•ด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. 

๋„ค ๊ฐœ์˜ ์ •์ˆ˜ M, N, x์™€ y๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, <M:N>์ด ์นด์ž‰ ๋‹ฌ๋ ฅ์˜ ๋งˆ์ง€๋ง‰ ํ•ด๋ผ๊ณ  ํ•˜๋ฉด <x:y>๋Š” ๋ช‡ ๋ฒˆ์งธ ํ•ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ. 

 

 

 

 

๐Ÿ‘‍๐Ÿ—จ ์ž…์ถœ๋ ฅ ๋ฐ์ดํ„ฐ

[์ž…๋ ฅ]

์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋Š” ํ‘œ์ค€ ์ž…๋ ฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ž…๋ ฅ์€ T๊ฐœ์˜ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

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

๊ฐ ์ค„์—๋Š” ๋„ค ๊ฐœ์˜ ์ •์ˆ˜ M, N, x์™€ y๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ M, N ≤ 40,000, 1 ≤ x ≤ M, 1 ≤ y ≤ N)

์—ฌ๊ธฐ์„œ <M:N>์€ ์นด์ž‰ ๋‹ฌ๋ ฅ์˜ ๋งˆ์ง€๋ง‰ ํ•ด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

3
10 12 3 9
10 12 7 2
13 11 5 6

[์ถœ๋ ฅ]

์ถœ๋ ฅ์€ ํ‘œ์ค€ ์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด, ์ •์ˆ˜ k๋ฅผ ํ•œ ์ค„์— ์ถœ๋ ฅํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ k๋Š” <x:y>๊ฐ€ k๋ฒˆ์งธ ํ•ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๋งŒ์ผ <x:y>์— ์˜ํ•ด ํ‘œํ˜„๋˜๋Š” ํ•ด๊ฐ€ ์—†๋‹ค๋ฉด, ์ฆ‰, <x:y>๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์€ ํ‘œํ˜„์ด๋ฉด, -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

33
-1
83

 

 

 

 

๐Ÿ”‘ ๋ฌธ์ œํ’€์ด

๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

 

  โ€ป [์ฐธ๊ณ ] ์ž˜๋ชป๋œ ์ฒซ ๋ฒˆ์งธ ํ’€์ด

๋”๋ณด๊ธฐ
from sys import stdin


def get_year(max_x, max_y, val_x, val_y) -> int:
    if val_x == val_y == 1:
        return 1
    for i in range(2, max_x * max_y + 1):
        if (max_x - val_x) % i == 0 and (max_y - val_y) % i == 0:
            return i
    return -1


if __name__ == '__main__':
    t = int(stdin.readline().rstrip())
    ans_list = []

    for i in range(t):
        m, n, x, y = map(int, stdin.readline().split())
        ans_list.append(str(get_year(m, n, x, y)))
    ans = '\n'.join(ans_list)
    print(ans)

์ฒซ ๋ฒˆ์งธ ํ’€์ด ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ ์œ„์™€ ๊ฐ™์•˜๋‹ค. ์ด์— ์ฃผ์–ด์ง„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋Œ๋ ค๋ณด์•˜๋”๋‹ˆ ๊ฒฐ๊ณผ๋Š” ์—‰๋ง์ง„์ฐฝ์ด์—ˆ๋‹ค.

get_year()์ด๋ผ๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์กฐ๊ฑด๋ฌธ์„ if (max_x - val_x) % i == 0 and (max_y - val_y) % i == 0๋ผ๊ณ  ํ•˜์˜€๋Š”๋ฐ, ํ•ด๋‹น ์กฐ๊ฑด์‹์ด ์ž˜๋ชป๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค. ์ฆ‰, ์ด๋Š” ํ•„์š”์ถฉ๋ถ„์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์กฐ๊ฑด์‹์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด max_x, max_y๊ฐ€ 10, 12์ด๊ณ  val_x, val_y๊ฐ€ 4, 4๋ผ๊ณ  ํ•ด๋ณด์ž. ์ด ๊ฒฝ์šฐ, ์ •๋‹ต์ธ i๋Š” 4์ด์–ด์•ผ ํ•œ๋‹ค. 

ํ—ˆ๋‚˜ i=2์ผ ๊ฒฝ์šฐ, max_x - val_x์™€ max_y - val_y ๋ชจ๋‘ 2๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฏ€๋กœ ์กฐ๊ฑด๋ฌธ์„ ๋งŒ์กฑํ•ด ๋‹ต์œผ๋กœ ์ธ์‹๋˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰ ์ฆ‰ i=4์ผ ๊ฒฝ์šฐ ์กฐ๊ฑด๋ฌธ์„ ๋งŒ์กฑํ•˜๊ธด ํ•˜์ง€๋งŒ ํ•ด๋‹น ๊ฒฝ์šฐ์—๋งŒ ๋งŒ์กฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ ํ•„์š”์ถฉ๋ถ„ํ•œ ์กฐ๊ฑด์ด ์•„๋‹ˆ๊ธฐ์— ์ด๋Š” ์ž˜๋ชป๋œ ์กฐ๊ฑด๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ•„์š”์ถฉ๋ถ„ ์š”๊ฑด์„ ๋งŒ์กฑํ•˜๋„๋ก ์กฐ๊ฑด๋ฌธ์„ ์ˆ˜์ •ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์žฌ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
๐Ÿ‘‰ ์—ฅ ๊ทธ๋ƒฅ ๋‹ค ์ž˜๋ชป๋œ ๋“ฏ? i๋ฅผ ๋‚˜๋ˆ ์•ผ๋˜๋Š”๋ฐ i๋กœ ๋‚˜๋ˆด๋„ค. ํ•ด๋‹น ํ’€์ด ๋ฌด์‹œํ•˜๊ธฐ.

 

from sys import stdin


def get_year(max_x, max_y, val_x, val_y) -> int:
    for i in range(1, max_x * max_y + 1):
        if (i % max_x == val_x % max_x) and (i % max_y == val_y % max_y):    # same as (i-1) % max_x == (val_x - 1)..
            return i
    return -1


if __name__ == '__main__':
    t = int(stdin.readline().rstrip())
    ans_list = []

    for i in range(t):
        m, n, x, y = map(int, stdin.readline().split())
        ans_list.append(str(get_year(m, n, x, y)))
    ans = '\n'.join(ans_list)
    print(ans)

๋‘ ๋ฒˆ์งธ ํ’€์ด ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ, ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€๊ธฐ์— ๋ฐฑ์ค€ ์‚ฌ์ดํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋ฅผ ๋งŒ์กฑํ•˜์˜€๋‹ค. ํ—ˆ๋‚˜ ์ œ์ถœ์‹œ ์‹œ๊ฐ„์ดˆ๊ณผ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋Š” M๊ณผ N์˜ ๋ฒ”์œ„๊ฐ€ 1์ด์ƒ 40,000 ์ดํ•˜์ธ๋ฐ ์ „์ฒด ๊ฒฝ์šฐ์˜ ์ˆ˜์ธ M*N์ด 1,600,000,000๊ฐ€์ง€๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฌ๋ฏ€๋กœ ์‹œ๊ฐ„์ œํ•œ์ธ 1์ดˆ๋ฅผ ๋„˜๊ธฐ๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค. (1์ดˆ=1์–ต)

๊ทธ๋ ‡๋‹ค๋ฉด ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์ธ๋ฐ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? 

 

๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ์ˆ˜๋ฅผ โ–ก๋ผ๊ณ  ํ•˜์ž. โ–ก๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค.

  1. โ–ก๋ฅผ M์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€ = X (์ด๋•Œ, M๊ณผ X๋Š” ์ƒ์ˆ˜)
  2. โ–ก๋ฅผ N์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€ = Y (์ด๋•Œ, N๊ณผ Y๋Š” ์ƒ์ˆ˜)

์ด ์ค‘ 1์„ ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„ํ•ด๋ณด๋ฉด 'โ–ก = i * M + X'๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ ์ด๋Š” 2์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•˜๋Š”๋ฐ, 2์˜ ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ์ˆ˜๋Š” N์„ ์ฃผ๊ธฐ๋กœ ๋ฐ˜๋ณต๋œ๋‹ค. ์ฆ‰ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ์ˆ˜ โ–ก๋Š” M*N์ด๋‚ด์˜ ๋ชจ๋“  ์ˆ˜์—์„œ ์ฐพ์„ ํ•„์š” ์—†์ด, ํ•ด๋‹น ์‹์—์„œ i๊ฐ€ 0<=i<=N์ธ ๋ฒ”์œ„์—์„œ ์ฐพ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ 1<=N<=40,000์œผ๋กœ ํ™•์—ฐํžˆ ์ค„๊ฒŒ ๋œ๋‹ค. ๋ฐ˜์˜ํ•˜์—ฌ ์ง  ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

from sys import stdin


def get_year(max_x, max_y, val_x, val_y) -> int:
    for k in range(0, max_y):
        if (k * max_x + val_x) % max_y == val_y % max_y:
            return k * max_x + val_x
    return -1


if __name__ == '__main__':
    t = int(stdin.readline().rstrip())
    ans_list = []

    for i in range(t):
        m, n, x, y = map(int, stdin.readline().split())
        ans_list.append(str(get_year(m, n, x, y)))
    ans = '\n'.join(ans_list)
    print(ans)

→ ์ด๋•Œ 1<=val_x<=N์ด๋ฏ€๋กœ %N์˜ ๊ฐ’ ์ฃผ์˜ํ•˜๊ธฐ!

 

 

 

 

 


 

๐Ÿ”” ํ’€์ด/๊ฐœ๋…์ •๋ฆฌ

  1. ๋ธŒ๋ฃจํŠธํฌ์Šค ๋ฌธ์ œ์—์„œ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๅคš!
    ๐Ÿ‘‰ M*N = 16์–ต์œผ๋กœ ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜๊ธฐ ๋•Œ๋ฌธ.
    ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์ œํ•ด๋ณด๊ธฐ. 
    ๊ฑด๋„ˆ ๋›ฐ์–ด ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณ ๋ คํ•ด๋ณด๊ธฐ. 
    ์•„ํ•˜, ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ๋ฒ”์œ„๋งŒ ๊ณ ๋ คํ•ด์•ผ ๊ฒ ๊ตฌ๋‚˜๋ผ๊ณ  ์ถ”์ธก! ๐Ÿ‘Œ
  2. ๋ชจ๋“ˆ๋Ÿฌ(%) TIP
    → X % N = X'์ด๋ฉด, (X-X')%N = 0์ด๋‹ค.

  3. โญ %N์˜ ๊ฐ’๊ณผ ๊ฒฐ๊ณผ๊ฐ’์˜ ๋ฒ”์œ„๊ฐ€ ๋‹ค๋ฅผ๋•Œ ์ฃผ์˜ํ•˜๊ธฐ! โญ
    → 0<= %N <= N-1์ธ๋ฐ 1<=๊ฒฐ๊ณผ๊ฐ’<=N์ธ ๊ฒฝ์šฐ!

 

728x90