새소식

⌨️ Algorithms/프로그래머스

[Python] 프로그래머스 Lv2_타겟 넘버

2022. 8. 7. 22:37

  • -

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

방법1) deque를 이용한 BFS

"""
입출력 예시)
numbers = [1, 1, 1, 1, 1], target = 3 -> 5
numbers = [4, 1, 2, 1], target = 4 -> 2
"""

# 방법1) deque를 이용한 BFS

from collections import deque

def solution(numbers, target):
    answer = 0
    de_que = deque()
    n = len(numbers)
  
    de_que.append([numbers[0],0]) # deque.append(x) -> x를 덱의 오른쪽에 삽입
    de_que.append([-1*numbers[0],0])

    while de_que:
        temp, idx = de_que.popleft() # deque.popleft() -> 덱의 가장 왼쪽(인덱스: 0)에 있는 원소를 덱에서 제거하고 그 값을 리턴
        idx += 1

        if idx < n:
            de_que.append([temp+numbers[idx], idx])
            de_que.append([temp-numbers[idx], idx])
        else:
            if temp == target:
                answer += 1

    return answer

 

  • deque.append(x) -> x를 덱의 오른쪽에 삽입
  • deque.popleft() -> 덱의 가장 왼쪽(인덱스: 0)에 있는 원소를 덱에서 제거하고 그 값을 리턴
 

[Python] Dequeue 사용하기

큐는 어떤 자료구조인가? 큐는 자료의 선입선출, FIFO(First-In-First-Out)을 보장하는 자료구조이다. 흔히 줄을 서 있는 사람들을 생각하면 쉽게 이해할 수 있다. 먼저 줄을 선 사람이 먼저 줄에서 벗

ooeunz.tistory.com

 

 

# temp, idx = de_que.popleft()

 while de_que:
 	temp, idx = de_que.popleft() 
    # deque.popleft() -> 덱의 가장 왼쪽(인덱스: 0)에 있는 원소를 덱에서 제거하고 그 값을 리턴
 
"""
deque([[4, 0], [-4, 0]])인 경우
-> temp: 4
-> idx: 0
"""

 

 

 


방법2) stack을 이용한 DFS

# 방법2) stack을 이용한 DFS
  
def solution(numbers, target):
    answer = 0
    queue = [[numbers[0],0], [-1*numbers[0],0]]
    n = len(numbers)

    while queue:
        temp, idx = queue.pop() # queue.pop() -> 리스트의 마지막 항목을 삭제하고 리턴
        idx += 1

        if idx < n:
            queue.append([temp+numbers[idx], idx])
            queue.append([temp-numbers[idx], idx])
        else:
            if temp == target:
                answer += 1

    return answer

 

 

5. 자료 구조 — Python 3.10.6 문서

5. 자료 구조 이 장에서는 여러분이 이미 배운 것들을 좀 더 자세히 설명하고, 몇 가지 새로운 것들을 덧붙입니다. 5.1. 리스트 더 보기 리스트 자료 형은 몇 가지 메서드들을 더 갖고 있습니다. 이

docs.python.org

 

 

# temp, idx = queue.pop()

while queue:
	temp, idx = queue.pop() 
    # queue.pop() -> 리스트의 마지막 항목을 삭제하고 리턴
 
"""
queue = [[4, 0], [-4, 0]]인 경우
-> temp: -4
-> idx: 0
"""

 

 

 


방법3) 재귀함수를 이용한 DFS

# 방법3) 재귀함수를 이용한 DFS
  
def solution(numbers, target):
    n = len(numbers)
    answer = 0
    
    def dfs(idx, result):
        if idx == n:
            if result == target:
                nonlocal answer
                answer += 1
            return
        else:
            dfs(idx+1, result+numbers[idx])
            dfs(idx+1, result-numbers[idx])
            
    dfs(0,0)
    
    return answer

 

 

 

코드 풀이 설명 참고)

 

https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-%ED%83%80%EA%B2%9F%EB%84%98%EB%B2%84-BFSDFS

 

[Python] 프로그래머스 level2 타겟넘버 (BFS/DFS)

타겟넘버 문제를 bfs와 dfs를 이용해서 풀어봤다. 아래 나오는 코드들은 다 모든 테스트케이스를 통과한 코드이다!

velog.io

 

 

 


DFS와 BFS 

 

  • DFS: 깊이 우선 탐색 
    • 모든 노드를 방문하고자 하는 경우에 이 방법 선택
    • BFS보다 좀 더 간단
    • 검색 속도는 BFS에 비해 느림
    • Stack 또는 재귀함수(Recursion)로 구현

DFS (출처: https://developer-mac.tistory.com/64)

 

  • BFS: 너비 우선 탐색
    • 주로 두 노드 사이의 최단 경로를 찾고 싶을 때 이 방법 선택
    • Queue로 구현

BFS (출처: https://developer-mac.tistory.com/64)

 

https://velog.io/@lucky-korma/DFS-BFS%EC%9D%98-%EC%84%A4%EB%AA%85-%EC%B0%A8%EC%9D%B4%EC%A0%90

 

DFS, BFS의 설명, 차이점

그래프란, 정점(node)과 그 정점을 연결하는 간선(edge)으로 이루어진 자료구조의 일종을 말하며,그래프를 탐색한다는 것은 하나의 정점으로부터 시작하여 차례대로 모든 정점들을 한 번씩 방문하

velog.io

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다!