https://school.programmers.co.kr/learn/courses/30/lessons/154538
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
from collections import defaultdict, deque
def solution(x, y, n):
if x == y:
return 0
d = defaultdict(lambda :0)
q = deque([x])
while q:
x= q.popleft()
for next_x in [x+n, x*2, x*3]:
if next_x > y:
continue
if d[next_x] > d[x]+1 or d[next_x] == 0:
d[next_x] = d[x] + 1
q.append(next_x)
if d[y] == 0:
return -1
else:
return d[y]
문제를 해결하는데 defaultdict
와 deque
라이브러리를 사용하고 bfs
알고리즘을 작성하였습니다.
defaultdict
:lambda : 0
을 입력받음으로 모든키에 대해서 값이 없는 경우에 0으로 초기화해줍니다.
defaultdict
라이브러리로 노드의 깊이를 저장하는데 사용합니다.
x = 10
, y = 40
, n = 5
인 예제를 확인해보겠습니다.
그림에서 볼 수 있듯이 graph
의 모습은 다음과 같습니다.
- 왼쪽 :
x+n
- 중앙 :
x*2
- 오른쪽 :
x*3
graph
에서 나올 수 있는 노드들을 구한뒤에 노드가 위치해있는 graph
의 깊이를 확인합니다.
깊이가 2
일때 40
값을 구할 수 있습니다.
코드를 확인해보면
초기 x
를 q
에 저장한뒤에 bfs
알고리즘을 수행합니다.
next_x
는 현재 노드를 기준으로 다음노드(x+n
, x*2
, x*3
)을 나타냅니다.
next_x
가 y
보다 커진다면 계산할 필요가 없기 때문에 continue
를 사용하여 건너뜁니다.
다음 노드의 깊이
가 현재 노드의 깊이 + 1
보다 크거나 초기값 0으로 되어있는 경우에는다음 노드의 깊이
는 현재 노드의 깊이 + 1
이 되고 q
에 다음노드
를 저장해줍니다.
bfs
알고리즘이 종료된다면 문제의 target인 d[y]
를 확인합니다
이때 bfs
를 수행했음에도 d[y]
가 0
이라면 x
를 y
로 변환할 수 없다는 의미이기 때문에 -1
을 반환합니다.
d[y]
가 0
이 아니라면 저장되어있는 d[y]
를 반환합니다.
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 프로그래머스 [3차] 방금그곡 파이썬(Python) (0) | 2023.03.23 |
---|---|
[코딩테스트] 프로그래머스 2개 이하로 다른 비트 파이썬(Python) (0) | 2023.03.22 |
[코딩테스트] 프로그래머스 예상 대진표 파이썬(Python) (1) | 2023.03.20 |
[코딩테스트] 백준 차이를 최대로 파이썬(Python) (0) | 2023.03.18 |
[코딩테스트] 프로그래머스 [3차] 파일명 정렬 파이썬(Python) (0) | 2023.03.17 |