Algo
[Python] 프로그래머스_타겟넘버
뉴비코
2023. 9. 27. 13:51
문제
https://school.programmers.co.kr/learn/courses/30/lessons/43165
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
시행착오 코드
이 코드는 "틀린"코드입니다.
코드를 구현하면서 백트래킹 방식으로, N과M 풀이법 처럼 리스트에 넣으려는 생각을 먼저 했다.
그래서 numbers의 개수만큼 사용한 것을 종료 조건으로 두고, 그 합의 값이 타겟의 값과 같다면 넣어주는 방식으로 쓰려했다.
하지만 합을 파라미터로 넣어주고, 거기에 리스트도 넣어주는 게 비효율적이었다.
(답도 나오지 않았다)
def solution(numbers, target):
cnt = 0
M = len(numbers)
ans = []
def dfs(n, nsum, nlst):
#리스트의 값을 모두 사용했나요?
if n == M:
#타겟값과 sum값이 같다면
if nsum == target:
ans.append(nlst)
return
for i in range(M):
dfs(n + 1, sum(nlst), nlst + [numbers[i]])
dfs(n + 1, sum(nlst), nlst + [-numbers[i]])
dfs(0,0,[])
answer = len(ans)
return answer
해결 코드
아직은 타인의 도움이 필요한 병아리(?)기에..머리를 싸매다 원인을 찾았다.
1. 리스트로 빼지 않고, 합의 값을 바로 넘겨주어도 된다. (나는 리스트로 만들고, 그 len값을 구하려 했다. 복잡왕 김복잡)
2. 합의 값이 타겟과 같다면 바로 방법의 수로 체크해줘도 된다.
dfs와 백트래킹 문제를 몇 개 더 풀어보면서 감을 잡아야 할 것 같다!
ans = 0
def solution(numbers, target):
result = 0
def dfs(n, result):
global ans
# 모든 숫자를 사용했나요?
if n == len(numbers):
# 결과 값이 타겟과 같나요?
if result == target:
# 방법의 수에 추가해주세요
ans += 1
return
# +로 들어가는 것
dfs(n+1, result + numbers[n])
# -로 들어가는 것
dfs(n+1, result - numbers[n])
dfs(0,0)
answer = ans
return answer