Algorithm/Baekjoon

[백준 16987] 계란으로 계란치기 (Python)

문제 링크 #

문제 해설 #

Idea #

  • Backtracking
  • 0번째 계란부터 마지막 계란까지의 모든 경우의 수를 탐색
  • 시간 단축을 위해 현재 계란이 깨진 경우 또는 나머지 모든 계란이 깨진 경우를 예외로 처리
  • 한 번에 두 개 이상의 계란을 치는 경우를 방지하기 위해 계란을 친 후 원상복구 수행

Time Complexity #

  • Backtracking: O(N^N) = 16,777,216

Data Size #

  • N: 1 <= int <= 8
  • S, W: 1 <= int <= 300

해설 코드 #

python
N = int(input())
eggs = list()

for _ in range(N):
    eggs.append(list(map(int, input().split())))

answer = 0
def dfs(eggs, idx):
    global answer
    if idx == N:
        answer = max(answer, len([s for s,w in eggs if s < 1]))
        return

    if eggs[idx][0] < 1:
        dfs(eggs, idx+1)
        return

    if len([s for s,w in eggs if s < 1]) >= N-1:
        answer = max(answer, N-1)
        return

    for target in range(N):
        if target != idx and eggs[target][0] > 0:
            eggs[target][0] -= eggs[idx][1]
            eggs[idx][0] -= eggs[target][1]
            dfs(eggs, idx+1)
            eggs[target][0] += eggs[idx][1]
            eggs[idx][0] += eggs[target][1]

dfs(eggs, 0)
print(answer)
PREV [백준 21318] 피아노 체조 (Python) NEXT [백준 16918] 봄버맨 (Python)