프로그래머스 level 2 타겟넘버 BFS
18 Oct 2021 | 기초 프로그래머스 TIL문제 설명
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 함수를 작성해주세요.
제한 조건
주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
각 숫자는 1 이상 50 이하인 자연수입니다.
타겟 넘버는 1 이상 1000 이하인 자연수입니다.
입출력 예
numbers | target | return |
---|---|---|
[1,1,1,1,1] | 3 | 5 |
사고 과정
0으로 시작해서 다음 수를 더하거나 빼는 경우의 수를 가지 2개로 뻗어서 계속 가지를 뻗어나가는 결과를 리스트에 보관했다가 마지막에 count로 원하는 결과값의 갯수를 세어준다.
제출 코드
def solution(numbers, target):
sup = [0]
#전체 노드의 합을 더해준 리스트를 super라고 하고 초기화해준다
for i in numbers:
# i가 numbers의 원소 길이만큼 반복하면서 sub이라는 배열을 생성한다
sub = []
for j in sup:
# j가 sup의 원소만큼 반복한다. 그러니까 +인 경우, -인 경우에 대해서 반복한다
sub.append(j+i)
sub.append(j-i)
#그 경우에 대한 값을 sub에 넣어둔다
sup = sub
#하나의 노드에 대한 탐색이 끝나면 반복이 끝나서 sub에서 계산한 값을 sup으로 덮어둔다
#이렇게 2중 반복을 마치게되면 sup에는 모든 경우에 대해서 +인 경우, -인 경우를 조합한 합을 가지게 된다
return sup.count(target)
queue 답안
from collections import deque
#collections 모듈의 deque는 double-ended queue의 약자로 데이터를 양방향에서 추가하고 제거할 수 있는 자료 구조이다.
def solution(numbers, target):
answer = 0
queue = deque() #queue 생성
length = len(numbers)
queue.append([-numbers[0], 0])
queue.append([+numbers[0], 0])
while queue :
num, i = queue.popleft()
#popleft()는 리스트의 첫 번째 데이터를 제거
if i+1 == length :
if num == target : answer += 1
else :
queue.append([num - numbers[i + 1], i + 1])
queue.append([num + numbers[i + 1], i + 1])
return answer
참고
배우고 정리하기 - level 2 - 타겟 넘버 ( python ) by 아뜨으츄 아뜨으츄