[SWEA] 5247: 연산
2021. 12. 30. 19:58ㆍPython/코딩 문제
# 문제 설명
정수 n, m값이 주어졌을 때, 다음 4가지 연산만을 사용하여 n값에서 m값에 도달해야한다.
- 4가지 연산 : +1, -1, *2, -10
n에서 m에 도달하는 최소한의 연산 횟수를 구한다.
단, 중간 연산 결과는 백만(1000000) 이하의 자연수다.
# 입출력 예시
첫 줄은 테스트 케이스 개수이고, 다음 줄부터 n, m이 주어진다.
입력 | 출력 |
3 2 7 3 15 36 1007 |
#1 3 #2 4 #3 8 |
# 코드 풀이
from collections import defaultdict
from collections import deque
def get_min_op(n, m):
visited = defaultdict(bool) # 방문했는지
d = defaultdict(int) # 최단거리
d[n] = 0
q = deque([n]) # 속도향상을 위해
visited[n] = True
while len(q) > 0:
v = q.popleft()
for w in [v+1, v-1, v*2, v-10]:
if not visited[w] and w <= 1000000:
q.append(w)
visited[w] = True
d[w] = d[v]+1 # 거리 증가
if w==m:
return d[w]
for i in range(int(input())):
n, m = list(map(int, input().split(' ')))
print('#{} {}'.format(i+1, get_min_op(n, m)))
return
# 핵심 포인트
- 하나의 값을 가지고 4가지 연산을 적용해 나아가므로, 그래프 알고리즘 중 너비우선탐색을 사용한다.
- 가장 먼저 방문한 것이 최단거리이므로, m값인 걸 확인하자마자 반환한다.
- 속도 향상을 위해 list대신 deque를 사용한다.
반응형
'Python > 코딩 문제' 카테고리의 다른 글
[백준] 1012: 유기농 배추 (0) | 2022.01.04 |
---|---|
[SWEA] 5248: 그룹 나누기 (0) | 2021.12.30 |
[백준] 1003: 피보나치 함수 (0) | 2021.12.27 |
[백준] 2×n 타일링 (0) | 2021.11.22 |
[백준] 그룹 단어 체커 (0) | 2021.11.14 |