[백준] 6064 카잉 달력 (파이썬)
파이썬/코딩테스트2023. 8. 31. 15:00
https://www.acmicpc.net/problem/6064
시간 초과를 해결하는 것이 핵심이다.
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가 나온다는 것이다.
'파이썬 > 코딩테스트' 카테고리의 다른 글
[백준] 22973 점프 숨바꼭질 (파이썬) (0) | 2023.10.19 |
---|---|
[백준] 1987 알파벳 (파이썬), 시간 초과 해결하는 법 (0) | 2023.10.14 |
[백준] 13549 숨바꼭질 3 (파이썬), 가중치와 탐색 순서 (0) | 2023.09.22 |
[백준] 11286 절댓값 힙 (파이썬), 우선순위 큐 설명 (0) | 2023.08.29 |
쉽게 백준 코딩테스트 입력 자동화하기 (0) | 2023.04.11 |
댓글()