<문제 링크>
https://school.programmers.co.kr/learn/courses/30/lessons/43165?language=python3
<정답 코드>
sol 1) BFS(너비 우선 탐색)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
from collections import deque
def solution(numbers, target):
answer = 0
q = deque()
n = len(numbers)
q.append([numbers[0], 0])
q.append([-1 * numbers[0], 0])
while q:
tmp, idx = q.popleft() # q의 원소들 뽑아서 확인
idx += 1
if idx < n: # 아직 모든 원소 사용 x
q.append([tmp + numbers[idx], idx])
q.append([tmp - numbers[idx], idx])
else: # 모든 원소 사용 완료
if tmp == target: # 조합으로 target값 만들어졌는지 확인
answer += 1
return answer
|
cs |
if)
deque q에서 맨 앞의 원소를 뽑아
다음 원소와의 연산 결과가 +일때와 -일때를 계산하고 q에 추가하는 방법으로 최종 연산 결과 가능한 모든 수를 구함
else)
모든 연산이 끝나면 맨 앞부터 원소를 뽑아 target과 일치하는지 확인 후, 일치하면 answer 값 +1
sol 2) DFS(깊이 우선 탐색)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
answer = 0
def DFS(idx, numbers, target, value):
# idx : 현재 숫자의 index, value : 현재까지 계산된 숫자의 합
global answer # global 변수로 선언해 재귀 호출 간 값 유지/업데이트
n = len(numbers)
if idx == n and target == value: # 모든 숫자 처리(idx == n) + 현재 값이 타겟과 일치(target == value)
answer += 1
return
if idx == n: # 모든 숫자 처리 후 타겟과 불일치하면 재귀호출 종료
return
# 현재 idx 숫자를 value에 더하고/빼고 다음 숫자로 넘어감
DFS(idx+1, numbers, target, value+numbers[idx])
DFS(idx+1, numbers, target, value-numbers[idx])
def solution(numbers, target):
global answer
DFS(0, numbers, target, 0)
return answer
|
cs |
재귀적 함수 호출을 사용해 DFS 방식으로 탐색하는 코드
'프로그래밍 > Python' 카테고리의 다른 글
백준_python 2178번 미로 탐색(그래프, BFS) (0) | 2024.04.21 |
---|---|
백준_python 1463번 1로 만들기(BFS, DP) (0) | 2024.04.21 |
프로그래머스_python lv2. 다리를 지나는 트럭(스택, 큐 - deque) (0) | 2024.04.18 |
백준_python 1966번 프린터 큐(스택, 큐) (0) | 2024.04.17 |
백준_python 2108번 통계학(시간초과, collections.Counter 모듈) (0) | 2024.04.08 |