STUDY/Algorithm

[백준] 2309 일곱 난쟁이

sinawi95 2021. 3. 4. 09:09
728x90

https://acmicpc.net/problem/2309 

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

dwarf = [int(input()) for _ in range(9)]
visited = [0] * 9
real_dwarf = []

def backtrack(index, total, vis_idx, arr, visit):
    if index == 7 and total == 100:
        real_dwarf.append([dwarf[i] for i in range(9) if visit[i]])
        return
    elif index > 7 or total > 100:
        return
    else:
        for i in range(vis_idx + 1, 9):
            if visit[i] == 0:
                visit[i] = 1
                backtrack(index + 1, total + arr[i], i, arr, visit)
                visit[i] = 0


backtrack(0, 0, -1, dwarf, visited)
print('\n'.join(map(str, sorted(real_dwarf[0]))))

재귀 백트래킹 방식으로 풀었다. 

사실 반쪽짜리 풀이인 것이 백트래킹을 했을 때 Prunning(가지치기) 하고, 답을 구했을때 함수를 끝내야하는데 제대로 하지 못하였다.

가지치기는 visit을 두어서 갔는지 확인하는걸로 했지만, 답을 구한경우에도 나머지 해도 다 돌게 된다.

아직 백트래킹은 어렵다...

'STUDY > Algorithm' 카테고리의 다른 글

[백준] N과 M (시리즈)  (0) 2021.03.04
[백준] 2798 블랙잭  (0) 2021.03.04
[백준] 7569 토마토  (2) 2021.03.02
[백준] 7576 토마토  (0) 2021.03.02
[백준] 1012 유기농배추  (0) 2021.03.01