[파이썬]백준 2309 일곱난쟁이

Byeonghyeon Kim·2021년 3월 11일
0

알고리즘문제

목록 보기
32/93
post-thumbnail

링크

백준 2309 일곱난쟁이


백트래킹으로 구현했다.
이번엔 가지치기를 시도했고 한번에 실패 끝에 성공했다.


오답 1

def perm(idx, j):
    global ans

    if sum(sel) > 100:
        return

    if idx == 7:
        if sum(sel) == 100:
            ans = sorted(sel)

    else:
        for i in range(j, 9):
            if visit[i] == 0:
                visit[i] = 1
                sel[idx] = dwarves[i]
                perm(idx + 1, j + 1)
                visit[i] = 0


dwarves = [int(input()) for _ in range(9)]
visit = [0] * 9
sel = [0] * 7
ans = []
perm(0, 0)
print('\n'.join(map(str, ans)))

가지치기를 위해 sum(sel) > 100 이라는 조건을 주니 자꾸 인덱스 에러가 났다.
해당 조건을 삭제하면 통과했으나 원하던 바가 아니라 해결을 위해 고민했다.
고민끝에 total변수를 하나 더 줘서 합을 계산하기로 했다.
근데 아직도 저게 왜 인덱스 에러가 나는지는 모르겠다..


정답 코드

def perm(idx, j, total):
    global ans

    if total > 100:
        return

    if idx == 7:
        if total == 100:
            ans = sorted(sel)

    else:
        for i in range(j, 9):
            if visit[i] == 0:
                visit[i] = 1
                sel[idx] = dwarves[i]
                perm(idx + 1, j + 1, total + dwarves[i])
                visit[i] = 0


dwarves = [int(input()) for _ in range(9)]
visit = [0] * 9
sel = [0] * 7
ans = []
perm(0, 0, 0)
print('\n'.join(map(str, ans)))

total 이라는 합을 계산하는 인자를 함수 넣어줘서 해당 인자를 활용해 가지치기를 했다.


알게된 것👨‍💻

  • sum()으로 조건을 판단하기 보단 함수에 조건을 판단할 인자를 추가하자.
profile
자기 주도 개발전 (개발, 발전)

1개의 댓글

comment-user-thumbnail
2021년 3월 13일

안녕하세요~~
매터모스트 보다가 왔어요
조합을 짜는 방식이 저랑은 조금 다르기도 하고 인덱스 에러가 나는 이유는 잘 모르겠지만ㅋㅋㅋㅋ

sum(sel)을 했을 때 오답인 이유는 아마 아래 코드에 따라서 조합을 짜다보면
sel에 같은 값이 들어가는 경우가 있습니다.
같은 값이 들어가더라도 코드가 돌아가면서 다른 값으로 바뀌는데 그 사이에 if문이 가지치기를 해버려서 답이 될 수 있는데 중간에 가지치기로 날아가버려서 그런 것으로 보여집니다.

근데 저는 인덱스 에러가 안나는데 혹시 어떤 예제에서 나는지 알 수 있을까요?

답글 달기