여기서 내가 가져간 방식은 제거하는 명령어가 온다면 제거를 한다. 그 다음 올바른 구조물인지 체크를 한다.
또 설치하는 명령어가 온다면 설치를 한다. 그 다음 올바른 구조물인지 체크를 한다.
즉, 우선 설치하거나 삭제하고 올바른지 체크를 하는 것이다.
그런데 설치 or 제거를 할 때 기둥과 보에 대해서 올바른 구조물 체크하는 방식이 다르다.
설치 or 제거할때 기둥이 가능한 경우는 다음과 같다.
1. 기둥이 맨 밑에 있는 경우
2. 보의 오른쪽 끝부분에 연결된 경우
3. 보의 왼쪽 끝부분에 연결된 경우
4. 다른 기둥의 위인 경우
보의 경우는 다음과 같다.
1. 보의 왼쪽 끝이 기둥과 연결되어 있는 경우
2. 보의 오른쪽 끝이 기둥과 연결되어 있는 경우
3. 다른 보들 사이에 연결되어 있는 경우
그래서 올바른 구조물을 체크하는 함수인 possible()을 만들어 줬다.
내가 설계한 코드는 아래와 같다.
def possible(answer): # 가능한지 체크하는 함수
for x, y, structure in answer:
if structure == 0: # 기둥인 경우
# 바닥 바로 위, 보의 오른쪽 끝부분에 연결된 경우, 보의 왼쪽 끝부분에 연결된 경우, 다른 기둥의 위인 경우
if y == 0 or [x - 1, y, 1] in answer or [x, y, 1] in answer or [x, y - 1, 0] in answer:
continue
return False
elif structure == 1: # 보인 경우
# 보의 왼쪽 끝이 기둥과 연결되어 있는 경우, 보의 오른쪽 끝이 기둥과 연결되어 있는 경우, 다른 보와 동시에 연결이 되어 있는 경우
if [x, y - 1, 0] in answer or [x + 1, y - 1, 0] in answer or (
[x - 1, y, 1] in answer and [x + 1, y, 1] in answer):
continue
return False
return True
def solution(n, build_frame):
answer = []
for item in build_frame:
x, y = item[0], item[1]
if item[3] == 1: # 설치하는 경우
answer.append([x, y, item[2]]) # 우선 삽입
if not possible(answer): # 불가능한 경우
answer.remove([x, y, item[2]]) # 다시 제거
elif item[3] == 0: # 제거하는 경우
answer.remove([x, y, item[2]]) # 우선 제거
if not possible(answer): # 불가능한 경우
answer.append([x, y, item[2]]) # 다시 삽입
answer.sort() # 정렬
return answer
print(solution(5, [[1,0,0,1],[1,1,1,1],[2,1,0,1],[2,2,1,1],[5,0,0,1],[5,1,0,1],[4,2,1,1],[3,2,1,1]]))
print(solution(5, [[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]]))