성장일기

[python] 백준 6064 - 카잉 달력 본문

알고리즘 문제

[python] 백준 6064 - 카잉 달력

김몽몽 2022. 1. 26. 13:33

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

애증의 카잉달력

 

Q>  M,N보다 작거나 같은 두 숫자 x,y를 가지고 년도를 표현

<M:N> 일 때 종말의 날 <- x,y의 최소공배수

즉, 최소공배수보다 작은 경우 k를 반환하고 아니면 -1

 

🧨 뭔소린가 했지만

결국 60갑자랑 똑같은 원리다ㅜㅜ

(🤩 조원분이 알려주셨다)

60갑자 구하는 법 찾아보고 블로그 뒤져가며 풀었다

 

주석에도 적어놨지만

결국 x와 y는 

k를 m으로 나눈 나머지, k를 n으로 나눈 나머지이다

1. 10 * i + x = 12 * j +y 인 것

    -> x에 10을 계속 더해주고 12로 나누었을 때 나머지가 y와 같으면 (10i+x)가 k가 된다

    -> (10*i + x) % 12 == y

    -> j는 결국 12의 배수이므로 12로 나누어줌

2. 결국 위 식은

    -> (10*i + x)에 y를 빼주고 12로 나누면 0으로 나눠떨어진다는 말이 된다

    -> (10*i + x - y) % 12 ==0 이 되는 것

나무위키 60갑자

def gcd(a,b):
    if b == 0:
        return a
    else:
        return gcd(b,a%b)
    
def lcm(a,b):
    return (a * b) // gcd(a,b)
    
'''
갑자 구하기
k년일 경우 
k = 10 * i + 나머지1(x) == 12 * j + 나머지2(y)
즉, 나머지1(x) + 10*i 를 12로 나누었을 때, 나머지2(y)와 같아야 함 
'''
# 결국 x+(m*i) 를 n으로 나눠준 나머지가 y와 같아야 함
# ==> x에 y를 빼주고 n으로 나누어떨어지면 정답
# 15번째 예시 <5,3>
#  5 % 12 = 5
#  15 % 12 = 3  -> 15번째 해
# --------------------------
# 5 -3 % 12 = 2
# 15 -3 % 12 = 2  -> 15번째 해

def cal(m,n,x,y):
    lcm_ = lcm(m,n)  # 최소 공배수, 멸망의 날(60갑자 참고)
    while x < lcm_:  # 멸망의 날 전까지
        if (x - y) % n == 0:  # x에 y를 빼주고 n으로 나누어떨어지면 정답
            return x
        x += m  # x에 계속 m을 더해줌 (위 주석에서 i)
    return -1

test = int(input())
for _ in range(test):
    m, n, x, y = map(int,input().split())
    print(cal(m,n,x,y))

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

[python] 백준 17299 - 오등큰수  (0) 2022.02.07
[python] 백준 1874 - 스택 수열  (0) 2022.02.04
[python] 백준 1374 - 강의실  (0) 2022.01.21
골드 5 🎉  (0) 2022.01.20
[python] 백준 1990 - 소수인팰린드롬  (0) 2022.01.20