루나의 TIL 기술 블로그

프로그래머스 level 2 타겟넘버 BFS

|

문제 설명

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 아뜨으츄 아뜨으츄

그럼에도 불구하고 - 코딩테스트 고득점 Kit DFS/BFS1 타겟넘버

파이썬에서 큐(queue) 자료 구조 사용하기

BFS/DFS 설명하는 예전 내 블로그 글