문제 설명
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 함수를 작성해주세요.
풀이
numbers = [ 1,1,1,1,1 ] 인 경우의 예를 들어보자. 그림에서는 4층까지 나타냈지만, 한층 더 내려가야한다.
한 층 내려갈 때마다, 이전 숫자에서 numbers 배열의 다음 숫자를 더하고 빼는 경우의 수를 취해준다.
새로운 배열을 만드는 것이 아닌, list의 슬라이싱을 잘 이용하여 층을 구분짓는다.
append는 2^x 개씩 늘어나고, 시작 idx 는 2x+1 씩 갱신하면 된다.
최종 층에 도달했을 때, target 값을 count 하자.
def solution(numbers, target):
idx = 0
arr = [0]
for i in numbers:
for j in range(idx, len(arr)):
arr.append(arr[j] + i)
arr.append(arr[j] - i)
idx = 2*idx + 1
return arr[2**(len(numbers)):].count(target)
DFS와 BFS를 연습하기 위해 다른 풀이를 더 참고했다.
>> DFS
def DFS(n, order, numbers, target):
if order == len(numbers)-1:
if n == target:
return 1
return 0
case1 = DFS(n+numbers[order+1], order+1, numbers, target)
case2 = DFS(n-numbers[order+1], order+1, numbers, target)
return case1 + case2
def solution(numbers, target):
num =0
num = DFS(numbers[0], 0, numbers, target) + DFS(-numbers[0], 0, numbers, target)
return num
좌우로 뻗은 노드를 0/1 으로 return 하여 총 합을 계속 더해가는 방식이다.
>> BFS
from collections import deque
def solution(numbers, target):
answer = 0
q = deque()
q.append((numbers[0], 0))
q.append((-numbers[0], 0))
while q:
n, order = q.popleft()
if order == len(numbers)-1:
if n == target:
answer += 1
continue
q.append((n+numbers[order+1], order+1))
q.append((n-numbers[order+1], order+1))
return answer
먼저 입력된 정보를 꺼내면서 다음 노드로 연결한다.
출처
https://school.programmers.co.kr/learn/courses/30/lessons/43165
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
728x90
'Programing > 프로그래머스 오답노트' 카테고리의 다른 글
[프로그래머스] [3차]압축 - ( 문자열 슬라이싱으로 dict.keys 조사 ) (0) | 2023.09.29 |
---|---|
[프로그래머스] 피로도 - ( 순열 permutations, 재귀 ) (0) | 2023.09.29 |
[프로그래머스] [1차]뉴스 클러스터링 (1) | 2023.09.28 |
[프로그래머스] 튜플 - ( list에 list도 append 가능, 2차원 배열 ) (0) | 2023.09.28 |
[프로그래머스] k진수에서 소수 개수 구하기 - ( sqrt(n)+1까지 조사 ) (0) | 2023.09.27 |
댓글