반응형
문제
https://school.programmers.co.kr/learn/courses/30/lessons/43165
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🐍파이썬
def solution(numbers, target):
answer = [0]
for i in numbers:
sub = []
for j in answer:
sub.append(j-i)
sub.append(j+i)
answer = sub
return answer.count(target)
Example
numbers = [1, 1, 1, 1, 1]
target = 3 일 때,
i = 1
sub = []
j = 0
sub.append(0 - 1)
sub.append(0 + 1)
answer = [-1, 1]
i = 1
sub = []
j = -1
sub.append(-1 - 1)
sub.append(-1 + 1)
j = 1
sub.append(1 - 1)
sub.append(1 + 1)
answer = [-2, 0, 0, 2]
i = 1
sub = []
j = -2
sub.append(-2 - 1)
sub.append(-2 + 1)
j = 0
sub.append(0 - 1)
sub.append(0 + 1)
j = 0
sub.append(0 - 1)
sub.append(0 + 1)
j = 2
sub.append(2 - 1)
sub.append(2 + 1)
answer = [-3, -1, -1, 1, -1, 1, 1, 3]
... 이하 생략
위와 같이 하나의 노드에서 가지를 뻗어가며 +했을 때의 결과와 -했을 때의 결과를 모두 구한다.
모든 과정이 끝났을 때 answer 안에 target 값이 몇 개나 들어있나를 체크해 타겟 넘버를 만드는 경우의 수를 구할 수 있다.
풀이 방법은 아래 블로그를 참고했다.
[ Programmers ] level 2 - 타겟 넘버 ( python )
코딩테스트 풀이 프로그래머스 level 2 문제 타겟 넘버 - 깊이/너비 우선 탐색(DFS/BFS) 문제 설명 n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예
train-validation-test.tistory.com
다른 풀이 방법
DFS
def solution(numbers, target):
if not numbers and target == 0 :
return 1
elif not numbers:
return 0
else:
return solution(numbers[1:], target-numbers[0]) + solution(numbers[1:], target+numbers[0])
answer = 0
def DFS(idx, numbers, target, value):
global answer
N = len(numbers)
if(idx == N and target == value): #종료조건
answer += 1
return
if(idx == N): #종료조건
return
DFS(idx+1,numbers,target,value+numbers[idx])
DFS(idx+1,numbers,target,value-numbers[idx])
def solution(numbers, target):
global answer
DFS(0,numbers,target,0)
return answer
BFS
from itertools import product
def solution(numbers, target):
l = [(x, -x) for x in numbers]
s = list(map(sum, product(*l)))
return s.count(target)
def solution(numbers, target):
answer = 0
queue = [(0, 0)]
length = len(numbers)
while queue:
n = queue.pop()
if n[0] < length:
queue.append((n[0] + 1, n[1] + numbers[n[0] - 1]))
queue.append((n[0] + 1, n[1] - numbers[n[0] - 1]))
elif n[1] == target:
answer += 1
return answer
🐥자바스크립트
function solution(numbers, target) {
var answer = 0;
function DFS(idx, result){
if(idx === numbers.length){ //종료조건. numbers의 끝까지 탐색했을 시
if(result === target){ //result가 target과 동일하면 answer++진행 후 리턴
answer += 1;
}
return //target과 result가 같지 않을 때는 그냥 리턴
}
DFS(idx+1, result - numbers[idx]); //노드에서 빼기 부분으로만 dfs
DFS(idx+1, result + numbers[idx]); //노드에서 더하기 부분으로만 dfs
}
DFS(0,0); //시작인덱스와 시작result값을 dfs함수에 대입해준다.
return answer;
}
풀이 방법은 아래 블로그를 참고했다.
[Python] 프로그래머스 level2 타겟넘버 (BFS/DFS)
타겟넘버 문제를 bfs와 dfs를 이용해서 풀어봤다. 아래 나오는 코드들은 다 모든 테스트케이스를 통과한 코드이다!
velog.io
dfs, bfs 어렵다...
참고할 만한 블로그
프로그래머스 - 타겟 넘버 (DFS, BFS) Python
문제 설명 n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. `1+1+1+1+1
velog.io
반응형
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[프로그래머스|파이썬] 공원 산책 (연습문제/level 1) (0) | 2023.04.28 |
---|---|
[프로그래머스|파이썬] 달리기 경주 (연습문제/level 1) (0) | 2023.04.27 |
[프로그래머스 | 파이썬 / 자바스크립트] 게임 맵 최단거리(깊이/너비 우선 탐색(DFS/BFS)/level 2) (0) | 2023.04.10 |
[프로그래머스 | 파이썬 / 자바스크립트] 스킬트리(Summer/Winter Coding(~2018) / level 2) (0) | 2023.04.02 |
[프로그래머스 | 파이썬 / 자바스크립트] 추억 점수(연습문제 / level 1) (0) | 2023.03.31 |
[프로그래머스 | 파이썬 / 자바스크립트] 평행(코딩테스트 입문 / level 0) (0) | 2023.03.16 |