https://programmers.co.kr/learn/courses/30/lessons/43165
코딩테스트 연습 - 타겟 넘버
n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수
programmers.co.kr
풀이 과정
양수들의 집합 numbers에 들어있는 모든 수를 사용하여 target을 만드는 방법이 몇 가지 있는지를 구하는 문제이다.
1. 조합
numbers 내부의 모든 수를 다 더한 뒤 (numbers의 모든 수를 양수로 선택했다고 가정한 뒤) 조합으로 경우의 수를 만들어 보면서 선택한 양수를 음수로 바꿔볼 수 있다.
예를 들어 [3, 4, 5, 7]이면 3, 4, 5, 7 전부를 양수로 선택했을 경우의 값은 19이고, 여기서 4를 음수로 선택했다고 가정하면 19 - (4 * 2) = 11이 됨을 고려하며 (3), (4), (5), (7), (3, 4), (3, 5), ... , (3, 4, 5, 7)의 모든 순서쌍을 만들어보며 각 순서쌍 안의 숫자들을 음수로 선택했을 경우의 합을 생각해보고 target과 같은지 판단해 볼 수 있다.
2. DFS
[4, 1, 2, 1]이 있으면 DFS로
1. 4 혹은 -4를 선택
2. 1 혹은 -1을 선택
3. 2 혹은 -2를 선택
4. 1 혹은 -1을 선택
를 점검하면서 4개 모두 골랐을 경우의 합이 target과 같은지 판단하고 같으면 정답의 개수를 증가시키는 방법으로 문제를 해결할 수 있다.
소스 코드
1번 방법
from itertools import combinations
def solution(numbers, target):
sum_value = sum(numbers)
answer = 0
target = (sum_value - target) // 2
for length in range(1, len(numbers) + 1):
for j in combinations(numbers, length):
if sum(j) == target:
answer += 1
return answer
2번 방법
answer = 0
def dfs(numbers, target, discovered=[], depth=0):
global answer
if len(numbers) == depth:
if sum(discovered) == target:
answer += 1
return
dfs(numbers, target, discovered + [numbers[depth]], depth+1)
dfs(numbers, target, discovered + [numbers[depth] * -1], depth+1)
def solution(numbers, target):
dfs(numbers, target)
return answer
'알고리즘 문제 풀이 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 정수 제곱근 판별 [파이썬] (0) | 2022.06.28 |
---|---|
프로그래머스 - 네트워크 [파이썬] (0) | 2022.06.27 |
프로그래머스 - 이상한 문자 만들기 [파이썬] (0) | 2022.06.26 |
프로그래머스 - 소수 찾기 [파이썬] (0) | 2022.06.25 |
프로그래머스 - 가장 큰 수 [파이썬] (0) | 2022.06.23 |