Python/구현

[2020KAKAO][Python] 기둥과 보 설치

Mr_Chu 2020. 9. 12. 01:24

programmers.co.kr/learn/courses/30/lessons/60061

 

코딩테스트 연습 - 기둥과 보 설치

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]] [[1,0,0],[1,1,1],[2,1,0],[2,2,1],[3,2,1],[4,2,1],[5,0,0],[5,1,0]] 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]] [[

programmers.co.kr

def possible(answer):
    for x, y, a in answer:
        if a == 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 a == 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 frame in build_frame:
        x,y,a,b = frame
        
        if b == 0: # 삭제일때
            answer.remove([x,y,a]) # 삭제해보고
            if not possible(answer): # False면
                answer.append([x,y,a]) # 다시 설치
        if b == 1: # 설치일때
            answer.append([x,y,a]) # 설치해보고 안되면 다시 삭제
            if not possible(answer):
                answer.remove([x,y,a])
        
        
    print(sorted(answer))
    return sorted(answer)

★idea : 설치와 삭제시 먼저 해보고 안되면 remove와 append로 다시 삭제/설치를 하는 판단