Skip to content

Commit eefc145

Browse files
committed
[BOJ]#16987. 계란으로계란치기/골드5/실패
https://www.acmicpc.net/problem/16987
1 parent 24e1242 commit eefc145

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
"""
2+
[BOJ]#16987.계란으로계란치기:백트레킹/골드5
3+
https://www.acmicpc.net/problem/16987
4+
"""
5+
import sys
6+
7+
#0. 입력 변수 정의 및 초기화 하기
8+
input= sys.stdin.readline
9+
N = int(input())
10+
eggs = [[] for _ in range(N)]
11+
12+
for i in range(N):
13+
durability , weight =map(int ,input().split())
14+
eggs[i] = [durability , weight]
15+
16+
# 1. backtracking 수행하기
17+
max_cnt = 0
18+
def backtracking(idx,cnt) :
19+
global max_cnt
20+
print(f"stage {idx}")
21+
# pruning 조건 : 현재 남은 횟수로 2개씩 깨도 max_cnt 업데이트 불가 경우
22+
if max_cnt >= (cnt + (N-idx)*2):
23+
return 0
24+
#1. 종료 조건 : (1. 모든 계란 선택 완료 n == N)
25+
if idx >= N : # 1개 이하 남아있을떄
26+
max_cnt = max(max_cnt , cnt)
27+
return 0
28+
29+
#1-2. 현재 선택한 계란 (idx) 가 깨져있는 경우
30+
if eggs[idx][0] <= 0 :
31+
backtracking(idx+1 , cnt)
32+
#2.동작 과정- 계란 깨기
33+
else : # 현재 계란 lived -> 부딫힐 계란 선택 & 부딫치기
34+
flag =False
35+
for j in range(N) :#현재 계란 부딫칠 계란 선택 (본인idx 아님 or 생존 )
36+
if j!= idx and eggs[j][0] > 0 :
37+
# 충돌
38+
eggs[idx] =eggs[idx] -eggs[j][1]
39+
eggs[j] =eggs[j] -eggs[idx][1]
40+
backtracking(idx+1 , cnt+int(eggs[idx][0]<=0) + int(eggs[j][0]<=0) ) # 충돌 계산하기
41+
flag = True
42+
# 충돌 원상 복귀
43+
eggs[idx] =eggs[idx] +eggs[j][1]
44+
eggs[j] =eggs[j] +eggs[idx][1]
45+
# 한 번도 안 깨짐 -> 선택한 idx 내려두고 다음 idx +1 로 이동
46+
if not flag :
47+
backtracking(idx+1 , cnt )
48+
49+
return 0
50+
51+
backtracking(0 ,0)
52+
print(max_cnt)

0 commit comments

Comments
 (0)