250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- fetch
- 유니크제약조건
- SQL프로그래밍
- 데코레이터
- 이진탐색
- CHECK OPTION
- shared lock
- BOJ
- PS
- dfs
- 연관관계
- 일대다
- 스토어드 프로시저
- 스프링 폼
- 다대다
- querydsl
- execute
- 비관적락
- 낙관적락
- JPQL
- 연결리스트
- eager
- 즉시로딩
- FetchType
- exclusive lock
- 동적sql
- 지연로딩
- 다대일
- 백트래킹
- 힙
Archives
- Today
- Total
흰 스타렉스에서 내가 내리지
dfs(백트래킹)가 어려운 나를 위해 본문
728x90
다음과 같은 템플릿을 따라가라.
대부분은 해결 가능할 것.
def dfs(...):
if ... : # 결과 도출 or 함수 종료 조건
return
for ... : # 다음 탐색 노드들
if ... : # 볼 필요도 없는 얘들 제거
dfs(,,,) # 재귀 호출
# 예시
def dfs(graph, v, visited):
visited[v] = True # 현재 노드를 방문 처리
print(v, end= ' ')
for i in graph[v]: # 현재 노드와 연결된 다른 노드를 재귀적으로 방문
if not visited[i]:
dfs(graph, i, visited)
"""
정수 N을 입력받아 1부터 N 까지의 숫자 중에서 합이 10이 되는 조합을 리스트로 반환
"""
def solution(N):
results = []
def bt(sum, selected_nums, start):
if sum == 10:
results.append(selected_nums)
return
for i in range(start, N+1):
if sum + i <= 10:
bt(sum+i, selected_nums + [i], i+1)
bt(0, [], 1)
return results
def find_solution():
empty_pos = find_empty_position()
if not empty_pos:
return True
row, col = empty_pos
for num in range(1, 10):
if is_valid(num, row, col):
board[row][col] = num
if find_solution():
return True
board[row][col] = 0
return False
return True 를 할거면, 이렇게 하라.
if dfs(): return True
이래야 끝남
def dfs(hp, dgs, visited):
global answer
answer = max(answer, len(visited))
for i in range(len(dgs)):
a, b = dgs[i]
if is_valid(hp, dgs[i]):
dfs(hp-b, dgs, visited | {i})
근데 바로 위 dfs() 메서드를 보면, visited 집합이 계속 추가됨
만약 메모리를 계속 먹는게 좀 그렇다 하면은, visited 을 배열로 해가지고 1, 0 처리할 수도 있음
아래처럼
def dfs(hp, dgs, visited):
global answer
// 정답 도출은 알아서
for i in range(len(dgs)):
a, b = dgs[i]
if is_valid(hp, dgs[i]):
visited[i] = 1
dfs(hp-b, dgs, visited)
visited[i] = 0
# https://school.programmers.co.kr/learn/courses/30/lessons/84512
def solution(word):
answer = -1
chars = ['A', 'E', 'I', 'O', 'U']
def dfs(string):
nonlocal answer
answer += 1
if string == word:
return True
if len(string) == 5:
return False
for c in chars:
if dfs(string + c):
return True
dfs('')
return answer
++
백트래킹 문제에서 combinations 를 쓰는 경우도 많다.
https://school.programmers.co.kr/learn/courses/30/lessons/92342#
중복조합 + Counter
'Problem Solving' 카테고리의 다른 글
[프로그래머스] 110 옮기기 ⭐️ - 문자열 처리 (0) | 2024.05.08 |
---|---|
[프로그래머스] Prim 인듯 아닌듯 Prim 같은 문제 (0) | 2024.04.24 |
[프로그래머스] 경주로 건설 - 필독 (0) | 2024.04.19 |
[프로스래머스] 코딩테스트 연습 > 해시 > 완주하지 못한 선수 (0) | 2024.04.11 |
[Time Complexity 분석] BOJ 9935 문자열 폭발 (0) | 2024.01.20 |