문제
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 |