프로그래머스_타겟넘버 (재풀이)

임정민·2023년 8월 1일
1

알고리즘 문제풀이

목록 보기
77/173
post-thumbnail

프로그래머스 BFS/DFS 문제입니다. 알고리즘 숙달을 위한 문제 반복풀이입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/43165

[나의 풀이1]

⌛ 소요 시간 53분

def solution(numbers, target): 
    
    answer = 0

    result = [0]

    while numbers:
        result2 = []
        num = numbers.pop()

        for res in result:
            result2.append(res+num)
            result2.append(res-num)

        # print(result2)
        result = result2

    for res2 in result2:
        if res2 == target:
            answer += 1

    return answer

입력값으로 주어진 요소에 대해 덧셈 혹은 뺄셈의 모든 경우의 수를 구하기위해
다음값을 이전 연산 결과 모든 요소들에 + 하거나 - 하는 알고리즘으로 해결하였습니다. 연산한 리스트의 요소 갯수가 이전 갯수 대비 x2배씩 늘어나는 구조입니다.

[나의 풀이2]

⌛ 과거 풀이

def solution(numbers, target) : 
    
    answer = 0
    
    # 값,인덱스
    stack = list([[numbers[0],0],[numbers[0]*(-1),0]])
    print(stack)

    while stack:
        
        v,n = stack.pop()

        if n < len(numbers)-1:
            n += 1
            stack.append([v+numbers[n],n])
            stack.append([v-numbers[n],n])
        
        else:
            if v == target:
                answer += 1

        print(stack)
    
    return answer

과거 풀이로써 + 혹은 - 연산한 결과를 append하고 이를 한가지 케이스의 모든 연산이 끝날 때까지 반복하는 것을 우선으로 하는 DFS 구현 풀이였습니다. 현재 연산한 값(v), 현재까지 연산한 횟수(n)를 표현하여 해결한 풀이입니다.

[나의 풀이3]

⌛ 과거 풀이

def solution(numbers, target) : 
    
    answer = 0
    
    from collections import deque
    
    # 값,인덱스
    queue = deque([[numbers[0],0],[numbers[0]*(-1),0]])
        
    while queue:
        
        v,n = queue.popleft()

        if n < len(numbers)-1:
            n += 1
            queue.append([v+numbers[n],n])
            queue.append([v-numbers[n],n])
        
        else:
            break
        
    for x in queue:
        if x[0] == target:
            answer += 1
    
    return answer

비슷한 방식이지만 위 풀이와 다르게 BFS 구조로 구현한 풀이입니다. 이전에 연산한 요소들에 덧셈 혹은 뺼셈 연산을 하되 모든 케이스에 대해 연산한 횟수가 같게끔 너비 우선 탐색으로 구현한 풀이입니다.

감사합니다.

profile
https://github.com/min731

2개의 댓글

comment-user-thumbnail
2023년 8월 1일

잘 봤습니다. 좋은 글 감사합니다.

1개의 답글