💻 링크
https://school.programmers.co.kr/learn/courses/30/lessons/60061
📖 문제 해결
문제에서 제시한 대로 코드를 작성해 나가면 해결할 수 있는 시뮬레이션 유형의 문제입니다. 주어진 build_frame
내의 frame
에 대해 제시된 행위(설치 혹은 삭제)를 우선 해본 후 설치 규칙에 위배되지 않는다면 그대로 진행하고, 만약 위배된다면 제시된 행위(설치 혹은 삭제)를 하기 이전의 상태로 돌아가도록 코드를 작성하여 문제를 해결하였습니다.
def build_test(frame_list):
# 리스트 내의 모든 프레임에 대하여 검사
for frame in frame_list:
# '기둥'이라면
if frame[2] == 0:
# 만약 기둥의 좌표가 (x,0)이라면 가능한 구조물
if frame[1] == 0:
continue
# 혹은 그 아래에 기둥이 있는 경우 가능한 구조물
elif [frame[0],frame[1]-1,0] in frame_list:
continue
# 혹은 아래에 받칠 수 있는 보가 있는 경우 가능한 구조물
elif [frame[0]-1,frame[1],1] in frame_list or [frame[0],frame[1],1] in frame_list:
continue
# 위의 경우가 아니라면 불가능한 구조물이므로 False 반환
else:
return False
# '보'라면
else:
# 한 쪽에 기둥이 있다면 가능한 구조물
if [frame[0],frame[1]-1,0] in frame_list or [frame[0]+1,frame[1]-1,0] in frame_list:
continue
# 양쪽에 보가 있다면 가능한 구조물
elif [frame[0]-1,frame[1],1] in frame_list and [frame[0]+1,frame[1],1] in frame_list:
continue
# 위의 경우가 아니라면 불가능한 구조물이므로 False 반환
else:
return False
# 검사 후에 이상이 없다면 True 반환
return True
def solution(n, build_frame):
result = []
for frame in build_frame:
# '삭제'라면
if frame[3] == 0:
# 우선 삭제를 해본 후
result.remove(frame[:3])
# 가능한 구조물이면 그대로 진행
if build_test(result):
continue
# 불가능한 구조물이면 다시 삭제 이전의 상태로 돌려놓기
else:
result.append(frame[:3])
# '설치'라면
else:
# 우선 설치를 해본 후
result.append(frame[:3])
# 가능한 구조물이면 그대로 진행
if build_test(result):
continue
# 불가능한 구조물이면 다시 설치 이전의 상태로 돌려놓기
else:
result.remove(frame[:3])
# 만들어진 result list를 정렬
result.sort()
return result