[Programmers] - DFS/BFS : 타겟넘버 (Level 2)

Programmers Coding Test - 깊이/너비 우선 탐색(DFS/BFS) - Level 2

안녕하세요, 이번 포스팅은 깊이/너비 우선 탐색과 관련한 문제인데요. 레벨2를 도전해 보았는데 체감난이도가 레벨1에 비해 훨씬 높았습니다 ㅠㅠ. 특히, 연산량이 많아 시간 초과가 되는 것을 방지하기가 참 어려웠습니다. 앞으로 동적할당과 재귀함수는 꾸준히 관심을 가지고 더 공부해야겠다고 다짐했습니다. 그럼, 문제 설명 들어갑니다 !

문제설명

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

문제 풀이1

이번 풀이에서 핵심이 되는 부분은

for items in posneg_itmes:
    result = [x+[y] for x in result for y in items]

부분인데요, 모든 경우의 수의 조합을 만들기 위한 코드입니다. 각 요소별로 +1과 -1을 곱한 쌍을 만들어 준 후, 하나씩 추가해주는 방식입니다.

numbers = [1,2,3,4,5]
target = 3
import numpy as np

def solution(numbers, target):
    posneg_items = [(items, -items) for items in numbers]

    result = [[]]

    for items in posneg_items:
        result = [x+[y] for x in result for y in items]

    result = [sum(items) for items in result]

    return result.count(target)

solution(numbers,target)
3

문제풀이2

다른 사람의 풀이중 재귀함수를 이용해서 아주 아름답게 풀이한 것이 있어서 많은 공부가 되었습니다 :) 앞에서부터 하나씩 줄어드는 number에서 가장 앞에 있는 요소를 각각 target에 더하고 빼면서, target이 0이 되는 부분을 카운팅하는 흐름인데요. 정말 재귀함수를 잘 사용했다는 생각이 들었습니다.

numbers = [1,2,3,4,5]
target = 3

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])

solution(numbers, target)
3

이렇게 이번 포스팅도 많은 공부가 되었습니다.
그럼, 다음 포스팅때 뵙겠습니다.

Comments