Algorithm/코딩테스트 (Python)
[프로그래머스][BFS] 타겟 넘버
싱브이
2023. 11. 14. 23:03
728x90
반응형
문제
n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다.
-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3
사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.
내 생각
1. BFS문제로 분류되어 있길래 큐를 사용한 BFS 먼저 생각했다.
deque 안에 인덱스를 합과 같이 넣으면 원하는 값을 더 쉽게 구할 수 있다고 생각했다.
그 이유는 tmp 값의 다음 값(다음 인덱스)에 위치한 numbers의 값을 + 와 -를 계산하기 때문!
즉, 위치를 편하게 알 수 있으므로 같이 넣어주는게 낫다고 생각한다.
종료 조건은 큐의 값이 없을 때까지 반복한다.
그리고 인덱스 번호가 numbers의 길이와 같고, tmp 값이 target 넘버와 같다면 방법 + 1이 된다.
간단하다 !
그리고 큐에 추가할 때 인덱스 번호를 늘려줘야 한다는 것을 잊지 말자 !
2. 스택을 사용한 DFS
큐 대신 스택을 사용한거 빼고는 그대로다 !
내 코드
1. BFS
from collections import deque
def solution(numbers, target):
answer = 0
queue = deque()
queue.append((0, 0))
while queue:
idx, tmp = queue.popleft()
if idx == len(numbers):
if tmp == target:
answer +=1
else:
queue.append((idx+1, tmp+numbers[idx]))
queue.append((idx+1, tmp-numbers[idx]))
return answer
2. DFS
def solution(numbers, target):
stack = [(0, 0)]
answer = 0
while stack:
idx, tmp = stack.pop()
if idx == len(numbers):
if tmp == target:
answer += 1
else:
stack.append((idx+1, tmp+numbers[idx]))
stack.append((idx+1, tmp-numbers[idx]))
return answer
728x90
반응형