반응형

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 solution(n, build_frame):
    cur = []
    def canBuildOrRemove(order): # 해당 order가 가능하면 True 불가능하면 False를 반환
        x, y, a, b = order
        if b == 1: 
            if a == 0: # 기둥 설치 
                return y == 0 or [x,y,1,1] in cur or [x-1,y,1,1] in cur or [x,y-1,0,1] in cur
            else:  # 보 설치
                return y != 0 and [x,y-1,0,1] in cur or [x+1,y-1,0,1] in cur or ([x-1,y,1,1] in cur and [x+1,y,1,1] in cur)
        else:
            if order[:-1]+[1] in cur: cur.remove(order[:-1]+[1]) # 삭제할 구조물이 있으면 해당 구조물 삭제
            else: return False # 없으면 order 불가능
            
            if a== 0: # 기둥 삭제
                cases = [[x,y+1,0,1], [x,y+1,1,1], [x-1,y+1,1,1]]
            else: # 보 삭제
                cases = [[x,y,0,1], [x+1,y,0,1], [x-1,y,1,1], [x+1,y,1,1]]
                
            t = [True for i in range(len(cases))]
            for i in range(len(cases)):
                if cases[i] in cur: # 현재 order가 영향을 주는 구조물들이 존재하면 유지 가능한지 판단
                    cur.remove(cases[i])
                    t[i] = canBuildOrRemove(cases[i])
                    cur.append(cases[i])
                    
            cur.append(order[:-1]+[1]) # 삭제한 구조물을 일단 다시 설치
            return sum(t) == len(t) # order가 영향을 주는 모든 구조물이 유지 가능하면 True 
    
    for build in build_frame:
        if canBuildOrRemove(build) == True: # 해당 order가 실행 가능하면,
            if build[3] == 1: cur.append(build) # 설치 order이면 설치
            else: cur.remove(build[:-1]+[1]) # 삭제 order이면 삭제
    
    return sorted([c[:-1] for c in cur], key=lambda x: (x[0],x[1],x[2]))

→ 구조물을 설치하는 조건은 간단하다.

하지만 구조물을 없앨때 고려해야 하는 부분이 많기 때문에 모든 경우를 조건문으로 걸기 힘들다.

따라서 삭제할 구조물이 유지에 영향을 줄 수 있는 또 다른 구조물들을 대상으로 

이 구조물들을 없애고 다시 설치하는것이 가능한지를 판단하는식으로 구현하였음.

반응형

'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글

블록 이동하기  (0) 2021.02.28
외벽 점검  (0) 2021.02.26
자물쇠와 열쇠  (0) 2021.02.23
괄호 변환  (0) 2021.02.23
문자열 압축  (0) 2021.02.23

+ Recent posts