1번째 풀이 / 메모리 초과
1 <= m , n <= 40000 거의 16억에 가까운 계산을 해야함. 메모리/시간 초과
# 메모리 초과 코드
import sys
input = sys.stdin.readline
t = int(input())
for _ in range(t):
m, n, tx, ty = map(int, input().split())
year = []
x, y = 1, 1
while True:
year.append((x, y))
if x == m and y == n:
break
x += 1
y += 1
if x > m:
x = 1
if y > n:
y = 1
if (tx, ty) in year:
ans = year.index((tx, ty)) + 1
print(ans)
else:
print(-1)
2. 정답 코드
t = int(input())
for _ in range(t):
m, n, x, y = map(int, input().split())
x -= 1
y -= 1
k = x
while k < n * m:
if k % n == y:
print(k + 1)
break
k += m
else:
print(-1)
m = 5, n = 7이라고 했을 때
0 - 35까지의 테이블을 만들어보면
x = 0 ~ m -1 까지
y = 0 ~ n -1 까지 반복된다.
m, n, x, y 모든 값에서 1을 빼 나머지 연산을 가능하게 변환시킨다.
i번째 카잉 달력을 i: <i%M, i%N>
으로 나타낼 수 있다. 이를 통해
x과 3이고 y가 2일 경우 m, n 중 하나를 고정해둔다.
i : <i*M+3, y> 꼴로 두고
y가 2일 경우만 찾아주면 된다.
O(n)으로 해결.
'백준 알고리즘 (Baekjoon Algorithm)' 카테고리의 다른 글
[파이썬] 백준 알고리즘 No.16953 A -> B (0) | 2022.01.07 |
---|---|
[파이썬] 백준 알고리즘 No.1248 맞춰봐 (0) | 2022.01.05 |
[파이썬] 백준 알고리즘 No.14500 테트로미노 (0) | 2021.12.30 |
[파이썬] 백준 알고리즘 No.3085 사탕 게임 (0) | 2021.12.29 |
[파이썬] 백준 알고리즘 No.2309 일곱 난쟁이 (0) | 2021.12.28 |