728x90
https://school.programmers.co.kr/learn/courses/30/lessons/60061
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
기둥이 조건에 맞는지 확인하고 True,False로 리턴하는 함수 1개
보가 조건에 맞는지 확인하고 True,False로 리턴하는 함수 1개를 우선 만들었다
기둥 설치시 조건확인함수를 돌려 True일 때 설치했다
기둥 삭제시 기둥을 우선 삭제한 다음, 남은 기둥과 보에 대해 조건확인을 싹 다 돌려 하나라도 False를 반환하는 경우 기둥을 다시 추가하여 기둥삭제 명령을 무시하도록 했다
보 설치시 조건확인함수를 돌려 True일 때 설치했다
보 삭제시 해당 보를 우선 삭제한 다음, 남아있는 기둥과 보에 대해 조건확인을 싹 다 돌려 하나라도 False를 반환하는 경우 보를 다시 리스트에 추가하여 보 삭제 명령을 무시하도록 했다
build_frame=[[0,0,0,1],[2,0,0,1],[4,0,0,1],[0,1,1,1],[1,1,1,1],[2,1,1,1],[3,1,1,1],[2,0,0,0],[1,1,1,0],[2,2,0,1]] #기둥/보 설치 작업 순서
#[x,y,a,b] x,y=설치 또는 삭제할 교차점의 좌표, a=0:기둥,1:보 , b=0:삭제,1:설치
#보는 오른쪽으로설치, 기둥은 위로 설치
#return 형식은 [x,y,a] 2차원리스트
def pillars(x,y,result): #기둥이 조건에 맞는지 확인하는 함수. x,y좌표, result리스트를 받아 True,False로 리턴
if y==0 or ([x-1,y,1] in result) or ([x,y,1] in result) or ([x,y-1,0] in result): #바닥 위거나, 보의 한쪽 끝이거나, 다른 기둥 위
return True
else:
return False
def beam(x,y,result): #보가 조건에 맞는지 확인하는 함수. x,y좌표, result 리스트를 받아 True,False로 리턴
if ([x,y-1,0] in result) or ([x+1,y-1,0] in result) or ([x-1,y,1] in result and [x+1,y,1] in result): #한쪽 끝부분이 기둥 위에 있거나, 양쪽이 다른 보와 동시에 연결된 경우
return True
else:
return False
n=5
result=[]
for i in build_frame:
x,y,a,b=i
if a==0: #설치 또는 삭제 대상이 기둥인 경우
if b==1: #설치하는 경우
if pillars(x,y,result): #설치가능한 경우
result.append([x,y,a])
# print(x,y,a,"기둥 설치 완")
# else:
# print(x,y,a,"기둥 설치 불가능")
elif b==0: #삭제하는 경우
result.remove([x,y,a]) #일단 빼고 난 후
for i in result:
x2,y2,a2=i
if a2==0: #기둥인 경우
if pillars(x2,y2,result)==False:
#설치 불가능한 경우임
result.append([x,y,a])
break
elif a2==1: #보인 경우
if beam(x2,y2,result)==False:
#설치 불가능한 경우임
result.append([x,y,a])
break
elif a==1: #보의 경우
if b==1: #설치하는 경우
if beam(x,y,result): #설치가능한 경우
result.append([x,y,a])
# print(x,y,a,"보 설치 완")
# else:
# print(x,y,a,"보 설치불가능")
elif b==0: #삭제하는 경우
result.remove([x,y,a]) #일단 삭제 한 후
# print(x,y,a,"일단삭제해봄")
for i in result:
x2,y2,a2=i
if a2==0:
if pillars(x2,y2,result)==False:
result.append([x,y,a])
# print(x,y,a,"보 삭제 불가능")
break
elif a2==1:
if beam(x2,y2,result)==False:
result.append([x,y,a])
# print(x,y,a,"보 삭제 불가능")
break
result.sort()
print(result)
728x90
'코딩 > 이코테-파이썬' 카테고리의 다른 글
이코테 구현: 자물쇠와 열쇠 (0) | 2022.08.29 |
---|---|
이코테: 구현 - 자물쇠와 열쇠 (0) | 2022.08.29 |
문자열 압축 (0) | 2022.08.28 |
무지의 먹방라이브 (2) | 2022.08.24 |
알고리즘 기출문제: 그리디2 (1) | 2022.08.17 |
댓글