[백준 16987번] 계란으로 계란치기

박형진·2023년 3월 13일
0

https://www.acmicpc.net/problem/16987


1. 코드

def answer_update(arr):
    global answer
    cnt = 0
    for i in arr:
        if i[0] <= 0:
            cnt += 1
    answer = max(answer, cnt)

def dfs(idx, curr_eggs):
    if idx == n:
        answer_update(curr_eggs)
        return

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

    flag = False
    for target in range(n):
        if target == idx:
            continue

        if curr_eggs[target][0] >= 1:
            flag = True
            curr_eggs[idx][0] -= curr_eggs[target][1]
            curr_eggs[target][0] -= curr_eggs[idx][1]
            dfs(idx+1, curr_eggs)
            curr_eggs[idx][0] += curr_eggs[target][1]
            curr_eggs[target][0] += curr_eggs[idx][1]
    
    if not flag:
        answer_update(curr_eggs)
        return


n = int(input())
eggs = []
for i in range(n):
    s, w = map(int, input().split())
    eggs.append([s, w])

answer = 0
dfs(0, eggs)
print(answer)

cnt 파라미터 코드

def dfs(idx, cnt):
    global ans
    # 최대값 가지치기: 남은 계란이 모두 깨져도 최대값보다 작다면 돌아간다.
    if ans >= cnt+((n-idx)*2):
        return
	
    # 정답 갱신
    if idx == n:
        ans = max(ans, cnt)
        return

    if eggs[idx][0] <= 0:
        dfs(idx+1, cnt)
    else:  # return 을 사용한 방식보다 else 를 사용하는게 더 한눈에 들어오는 것 같음
        flag = False
        for target in range(n):
            if target == idx or eggs[target][0] <= 0:
                continue

            if eggs[target][0] >= 1:
                flag = True
                eggs[idx][0] -= eggs[target][1]
                eggs[target][0] -= eggs[idx][1]
                # cnt+ 부분을 if else를 사용하지 않고 한 줄로 처리하는 방식 기억
                dfs(idx+1, cnt+int(eggs[idx][0]<=0)+int(eggs[target][0]<=0))
                eggs[idx][0] += eggs[target][1]
                eggs[target][0] += eggs[idx][1]
		
        # idx == n 까지 가지 않고 바로 정답 도출
        if not flag:
            ans = max(ans, cnt)
            return


ans = 0
n = int(input())
eggs = []
for i in range(n):
    s, w = map(int, input().split())
    eggs.append([s, w])

dfs(0, 0)
print(ans)
profile
안녕하세요!

0개의 댓글