Daily Coding Test/Python
[230301] 프로그래머스 Python Level 2. 타겟 넘버
dev_swcyu
2023. 3. 1. 09:55
문제 설명 / 제한사항 / 입출력 예 / 입출력 예 설명
더보기
입출력 예 설명
문제 설명
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 |
| [4, 1, 2, 1] | 4 | 2 |
입출력 예 #1
문제 예시와 같습니다.
입출력 예 #2
+4+1-2+1 = 4
+4-1+2-1 = 4
- 총 2가지 방법이 있으므로, 2를 return 합니다.
다른 사람 풀이 (1)
def solution(numbers, target):
answer = 0
que = [[0,0]]
while len(que)>0:
index, a = que.pop()
if index < len(numbers):
que.append([index+1, a+numbers[index]])
que.append([index+1, a-numbers[index]])
if index == len(numbers):
if a == target:
answer += 1
return answer
다른 사람 풀이 (2)
def solution(numbers, target):
count = 0
def dfs(i, sign, summation):
nonlocal count
if i==len(numbers):
if summation == target:
count = count + 1
return
summation = summation + numbers[i]*sign
dfs(i+1, 1, summation)
dfs(i+1, -1, summation)
for sign in [-1, 1]:
dfs(0, sign, 0)
return count/2
- `return count/2`하는 이유 추측
- dfs() 함수를 호출하는 과정에서 부호가 + 일 때, - 일 때 한 번씩 호출
- `summation == target`에 해당하는 경우가 각 부호당 한 번씩 총 두 번 count
- 따라서 결과 반환 시 2로 나눠주는 것 같다.
- return으로 함수 중간에서 빠져나오기 (https://dojang.io/mod/page/view.php?id=2339)
- 보통 if문과 함께 사용해서 특정 조건에 해당할 때 함수 중간에서 빠져나올 수 있게한다
- nonlocal
- 함수와 함수가 중첩되었을 때 외부 함수와 내부 함수 사이에 생기는 비지역 범위 (nonlocal/enclosing)
다른 사람 풀이 (3)
def solution(numbers, target):
result = 0
def dfs(num, level):
nonlocal result
if level == len(numbers):
if num == target:
result += 1
return
signs = [-num, num]
if level == 1:
for i in range(2):
dfs(signs[i] + numbers[level], level + 1)
dfs(signs[i] - numbers[level], level + 1)
else:
dfs(num + numbers[level], level + 1)
dfs(num - numbers[level], level + 1)
dfs(numbers[0], 1)
return result