프로그래머스 - 기둥과 보 설치

최대 1 분 소요

프로그래머스(Kakao 2020)- 기둥과 보 설치

프로그래머스

해결방법

이 문제는 시간제한이 5초로 넉넉한 편이므로 O(N^3) 으로 해결이 가능하다.

건축물을 설치하거나 철거할 경우를 일일이 확인하는 함수를 구현하는 방법으로 해결했다.

# 현재 설치되거나 삭제할 건축물이 가능한지 판별하는 함수
def check(answer):
    for x, y, a in answer:
        if a == 0: # 기둥인 경우
            # '바닥위' or '보의 한쪽 끝부분 위' or '다른 기둥위' 라면 가능
            if y == 0 or [x-1,y,1] in answer or [x,y,1] in answer or [x,y-1,0] in answer:
                continue
            else:
                return False
        elif a == 1: # 보 인경우
            # '한쪽 끝부분이 기둥 위' or '양쪽 끝부분이 다른 보와 동시에 연결'
            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
            else:
                return False
    return True

def solution(n, build_frame):
    len_build = len(build_frame)
    answer = []
    
    for frame in build_frame:
        x, y, a, b = frame
        if b == 1: # 설치하는 경우
            answer.append([x,y,a])
            if check(answer) is not True:
                answer.remove([x,y,a])
        elif b == 0: # 철거하는 경우
            answer.remove([x,y,a])
            if check(answer) is not True:
                answer.append([x,y,a])
    answer = sorted(answer) # 정렬
    return answer


n = 5
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]]
print(solution(n, build_frame))

댓글남기기