코딩 테스트/삼성 기출
2018상_디버깅(백준 15684.사다리 조작.py)
Carnival7
2024. 6. 16. 14:33
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
import sys
from copy import deepcopy
from itertools import combinations
input=sys.stdin.readline
MAX=int(1e9)
n,m,h=map(int,input().split())
a=[[0]*(n+1) for _ in range(h+2)]
ans=MAX
for _ in range(m):
x,y=map(int,input().split())
a[x][y]=1
a[x][y+1]=2
# 가로선 넣을 자리 후보 뽑기
cand=[]
for x in range(1,h+1):
for y in range(1,n):
# 해당 칸이나 오른쪽 칸에 1 또는 2가 있을 경우는 제외
if 1<=a[x][y]<=2 or 1<=a[x][y+1]<=2:
continue
cand.append([x,y])
# i열이 i가 나오는 지 검사
def check(a):
result=True
for y in range(1,n+1):
col=y
# 아래로 내려가며 탐색
for x in range(1,h+1):
# 1인 경우 오른쪽
if a[x][y]==1:
y+=1
# 2인 경우 왼쪽
elif a[x][y]==2:
y-=1
if y!=col:
result=False
break
return result
# 사다리 추가 안 해도 될 시 0 출력
if check(a):
print(0)
sys.exit(0)
# 후보들 중 1~3개를 뽑는 모든 조합의 경우의 수 탐색
for num in range(1,4):
for comb in combinations(cand,num):
# 이번 조합의 칸들 채우기
for x,y in comb:
a[x][y]=1
a[x][y+1]=2
# i열이 i가 나오면 num 출력
if check(a):
print(num)
sys.exit(0)
# 이번 조합 칸들 비우기
for x, y in comb:
a[x][y]=0
a[x][y+1]=0
print(-1)