흰 스타렉스에서 내가 내리지

dfs(백트래킹)가 어려운 나를 위해 본문

Problem Solving

dfs(백트래킹)가 어려운 나를 위해

주씨. 2024. 4. 21. 21:13
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#

 

프로그래머스

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

programmers.co.kr

 

중복조합 + Counter