[Programmers] 기둥과 보 (구현 Lv.3) - Python

꼬마요리사레미·2023년 5월 31일

Algorithm

목록 보기
35/41

1. 문제


기둥과 보

2. 풀이


코드
def solution(n, build_frame):
    answer = []
    for x, y, a, b in build_frame:
        if b == 0: #삭제
            if a == 0: #기둥 삭제
                if [x, y+1, 0] in answer:
                    if not([x-1, y+1, 1] in answer or [x, y+1, 1] in answer): 
                        continue
                if [x-1, y+1, 1] in answer:
                    if not([x-1, y, 0] in answer or ([x-2, y+1, 1] in answer and [x, y+1, 1] in answer)):
                        continue
                if [x, y+1, 1] in answer:
                    if not([x+1, y, 0] in answer or ([x-1, y+1, 1] in answer and [x+1, y+1, 1] in answer)):
                        continue
                
                answer.remove([x, y, a])
                    
            if a == 1: #보 삭제   
                if [x, y, 0] in answer:
                    if not([x, y-1, 0] in answer or [x-1, y, 1] in answer): 
                        continue
                if [x+1, y, 0] in answer:
                    if not([x+1, y-1, 0] in answer or [x+1, y, 1] in answer):
                        continue
                if [x-1, y, 1] in answer:
                    if not([x, y-1, 0] in answer or [x-1, y-1, 0] in answer):
                        continue
                if [x+1, y, 1] in answer:
                    if not([x+1, y-1, 0] in answer or [x+2, y-1, 0] in answer):
                        continue
                answer.remove([x, y, a])
        if b == 1: #설치
            if a == 0: #기둥 설치
                if y == 0:
                    answer.append([x,y,a])
                else:
                    if [x, y-1, 0] in answer or [x-1, y, 1] in answer or [x, y, 1] in answer:
                        answer.append([x,y,a])
            if a == 1: #보 설치
                if [x, y-1, 0] in answer or [x+1, y-1, 0] in answer:
                    answer.append([x, y, a])
                elif [x-1, y, 1] in answer and [x+1, y, 1] in answer:
                    answer.append([x, y, a])
                    
    answer.sort(key=lambda x: (x[0], x[1], x[2]))    
    return answer
입력 및 출력
n = 5
build_frame = [[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]]

>> [[1,0,0],[1,1,1],[2,1,0],[2,2,1],[3,2,1],[4,2,1],[5,0,0],[5,1,0]]

3. 로직


  1. 주어진 build_frame을 순회하면서 각각의 작업을 수행한다.

  2. 작업이 삭제인 경우:

  • a가 0인 경우 (기둥 삭제):
    • 기둥 위에 다른 기둥이 설치된 경우 : 해당 기둥을 받치고 있는 보가 하나도 없을 경우 삭제 불가
    • 기둥 왼쪽으로 보가 설치된 경우 : 해당 보의 왼쪽에 기둥이 없거나 양쪽으로 보가 없을 경우 삭제 불가
    • 기둥 오른쪽으로 보가 설치된 경우 : 해당 보의 오른쪽에 기둥이 없거나 양쪽으로 보가 없을 경우 삭제 불가
  • a가 1인 경우 (보 삭제):
    • 보 왼쪽 위에 기둥이 설치된 경우 : 해당 기둥을 받치고 있는 기둥이 없거나 왼쪽에 보가 없을 경우 삭제 불가
    • 보 오른쪽 위에 기둥이 설치된 경우 : 해당 기둥을 받치고 있는 기둥이 없거나 오른쪽에 보가 없을 경우 삭제 불가
  1. 작업이 설치인 경우:
  • a가 0인 경우 (기둥 설치):
    • 바닥이거나 아래쪽에 기둥이 있거나 왼쪽 혹은 오른쪽에 보가 있는 경우 설치 가능
  • a가 1인 경우 (보 설치):
    • 왼쪽 혹은 오른쪽에 기둥이 있거나 양쪽에 보가 있는 경우 설치 가능
  1. 작업을 모두 처리한 후, 최종적으로 남은 기둥과 보의 좌표를 정렬하여 반환한다.

0개의 댓글