원래 코드

import sys
# sys.stdin = open("input.txt")


def solve(cnt):
    if cnt == 2 * n:
        print(*answer)
        exit()

    for j in range(2 * n):
        if answer[j] == -1:
            for i in range(n):
                if not visited[ls[i]]:
                    if j + ls[i] + 1 < 2 * n and answer[j + ls[i] + 1] == -1:
                        answer[j] = ls[i]
                        answer[j + ls[i] + 1] = ls[i]
                        visited[ls[i]] = True
                        solve(cnt + 2)
                        answer[j] = -1
                        answer[j + ls[i] + 1] = -1
                        visited[ls[i]] = False

n = int(input())
ls = sorted(list(map(int, input().split())))

if ls[-1] + 2 > 2 * n:
    print(-1)
else:
    for i in range(n):
        visited = [False] * 17
        answer = [-1] * (2 * n)
        if ls[i] + 1 < 2 * n:
            answer[0] = ls[i]
            answer[ls[i] + 1] = ls[i]
            visited[ls[i]] = True
            solve(2)

    print(-1)

수정 코드

import sys
sys.stdin = open("input.txt")

def solve(cnt):
    if cnt == 2 * n:
        print(*answer)
        exit()

    if answer[cnt] != -1:
        solve(cnt + 1)
        return

    for i in range(n):
        if not visited[ls[i]]:
            if cnt + ls[i] + 1 < 2 * n and answer[cnt + ls[i] + 1] == -1:
                answer[cnt] = ls[i]
                answer[cnt + ls[i] + 1] = ls[i]
                visited[ls[i]] = True
                solve(cnt + 1)
                answer[cnt] = -1
                answer[cnt + ls[i] + 1] = -1
                visited[ls[i]] = False

n = int(input())
ls = sorted(list(map(int, input().split())))

visited = [False] * 17
answer = [-1] * (2 * n)
solve(0)
print(-1)

:star: 풀이

2n 크기의 리스트를 앞에서부터 체크하면서 갖고 있는 숫자를 채울 수 있으면 채우는 방식으로 진행했다.

처음 코드를 짤 때는 for 문으로 전부 체크하면서 진행하였기 때문에 시간이 엄청 오래걸렸다.

맞힌 사람들의 풀이를 보던 도중 나랑 제일 가깝게 풀면서도 시간이 월등히 줄어든 코드를 참고하여 다시 풀어보았다.

1469

백트래킹은 아직도 많이 헷갈린다 ㅠ 더 많이 연습해야겠다.

댓글남기기