본문 바로가기

문제 풀이

타겟 넘버

문제

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 이하인 자연수입니다.

문제를 보고 든 생각

BFS를 활용해보려고 들어간 문제인데, 참...

또 손도 못댔다.

 

검색 후 알게 된 풀이

from collections import deque

numbers = [4, 1, 2, 1]
target = 4
count = 0
default_val = [0]

for num in numbers:
    temp = []
    for val in default_val:
        temp.append(val + num)
        temp.append(val - num)
    default_val = temp
for val in default_val:
    if val == target:
        count += 1
print(count)

 

과정은 아래와 같다.

우선 설명 전, input으로 들어온 Numbers는 [4, 1, 2, 1] 그리고 타겟 넘버는 4라고 하겠다.

 

1. 타겟 넘버가 만들어지는 횟수를 저장하기 위한 변수인 count를 0으로 초기화한다. 그리고 numbers에 담긴 요소들의 덧셈과 뺄셈으로 나올 수 있는 모든 경우의 수를 담을 리스트인 default_val을 리스트 요소 0을 담아 초기화한다.

 

2. numbers의 요소와 default_val에 담겨 있는 요소인 0을 더해주고 빼준다. 그리고 이를 미리 생성해둔 temp 리스트에 저장한다.

-> 여기에서 val값과 num값의 계산값을 temp에 넣는 이유는 무한 루프를 막기 위해서다. 여기에서 만약 계산값을 default_val에 저장한다면 for이 default_val의 요소들을 가지고 반복하고 있기 때문에 계속 append되면서 반복문이 무한으로 빠지게 된다.

 

3. 대신 temp에 저장된 값은 for문이 끝나면 바로 계산값을 저장하는 리스트인 default_val에 넘겨준다.

 

4. 모든 numbers의 요소가 계산을 완료했다면 이제 default_val 리스트에 타겟 넘버가 몇 개 저장되어 있는지 확인할 차례이다.

 

5. 만약 타겟 넘버와 같은 값으로 계산된 값이 리스트 안에 담겨있다면 탐색될 때마다 count를 1씩 더해준다.

 

6. count 값을 답으로 제출한다.

 

느낀 점

풀이가 떠오르지 않는다면

그래서 검색을 해버렸다면

 

검색이라는 결정에 대해 후회하지 않기 위해

반복해서 보도록 하자.

'문제 풀이' 카테고리의 다른 글

미로 탐색  (0) 2022.10.27
숨바꼭질  (0) 2022.10.25
조이스틱  (0) 2022.10.25
4일차, 큰 수 만들기  (0) 2022.10.23
3일차, 가장 큰 수  (0) 2022.10.22