[백준] 6064 카잉 달력 (파이썬)

파이썬/코딩테스트|2023. 8. 31. 15:00

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

 

6064번: 카잉 달력

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

www.acmicpc.net

시간 초과를 해결하는 것이 핵심이다.

 

import sys
input = sys.stdin.readline
print = sys.stdout.write

def calc(M, N, x, y):
    cnt = 0
    cnt += x
    while cnt <= M*N+1:
        # temp = N if (cnt % N) == 0 else (cnt % N)
        temp = (cnt-1) % N + 1  # 라인10. 동일
        if (temp == y):
            return cnt
        else:
            cnt += M
    else:
        return (-1)

for _ in range(T := int(input())):
    M, N, x, y = map(int, input().split())
    ans = calc(M, N, x, y)
    print(str(ans)+'\n')

 

1. 연산을 별도의 함수를 선언 후 그 속에서 한다면 속도를 2배 가량 빠르게 할 수 있다. 링크 https://8iggy.tistory.com/155 참고

2. while else 구문을 이용한다면 별도의 flag 없이 분기를 시킬 수 있다. 지금의 코드는 return을 사용해서 필요가 없지만.

3. cnt=x와 cnt += M을 통해 cnt%M=x는 언제나 보장이 되어있기 때문에 라인 11에서 (cnt%M)==x과 같은 조건은 필요가 없다.

4. 라인 9 혹은 라인 10은 기본적으로 (cnt%N)==y와 동일하다. 문제는 12345678에 대한 모듈러 4 연산에 대한 결과는 12301230이라는 점이다. 이것을 문제에 제시된 조건인 12341234로 바꾸기 위해서는 위와 같이 코드를 살짝 변형해주면 된다.

5. 4번 대신 (cnt-y)%N==0을 시행해도 된다. 이 역시 기본적으로 (cnt%N)==y와 동일하다. 나머지 법칙에 의해 (cnt%N - y%N)==0과 동일한데 y<=N이므로 이 값은 언제나 cnt%N = y%N일 때 참이다. y%N과 y의 차이점은 전자는 연산값이 1230이 나온다는 것이고 후자는 1234가 나온다는 것이다.

댓글()