띠리링구 2022. 3. 22. 01:13

코딩테스트 연습 - 기둥과 보 설치 | 프로그래머스 (programmers.co.kr)

 

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

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

 

구현 문제다.

좌표를 잘 생각하면서 하면 그리 어렵지는 않을거같다.

내가보기에 카카오 구현문제의 최고봉은 '블록 이동하기'인거같음.

문제의 기둥과 보가 있을 수 있는 조건을 잘 보고

특정 좌표 x,y에 기둥 혹은 보를 설치할 때 어느 좌표에 뭐가 있어야 되는지를 잘 나타내면 될거같다.

예를 들어 x,y에 기둥을 설치하려면

(x,y)에 보가 있거나

(x-1,y)에 보가 있거나

y=0이거나

(x,y-1)에 기둥이 있어야 한다.

이런걸 그대로 정리하고 옮기면 될듯하다.

삭제의 경우에는.. 글쎄.. 일일이 전체검사를 해야하나? 문제의 상수조건을 보면 수가 그리 크지 않아서 괜찮을지도?

일단 넣어보고 전체검사를 한 다음에 안된다 싶으면 빼는걸로!

 

def valid(structlist, x, y, structure):
    if structure == 0:
        return (x,y,1) in structlist or (x-1,y,1) in structlist or y==0 or (x,y-1,0) in structlist
    else:
        return (x+1,y-1,0) in structlist or (x,y-1,0) in structlist or ((x-1,y,1) in structlist and (x+1,y,1) in structlist) 
        
def all_valid(structlist):
    for x,y,struct in structlist:
        if not valid(structlist,x,y,struct):
            return False
    return True

def solution(n, build_frame):
    
    answer = set()
    
    for x,y,a,b in build_frame:
        if b == 1:
            if valid(answer,x,y,a):
                answer.add((x,y,a))
        else:
            answer.discard((x,y,a))
            if not all_valid(answer):
                answer.add((x,y,a))
                
    answer = list(answer)
    answer.sort()
    
    return answer

 

set로 구현한 이유는 넣고 빼는게 list보다 빠를거같아서. 실제로 리스트에서 빼는 연산은 O(N), set는 O(1)

 

이 문제 첨봤을 땐 좀 많이 어려웠는데 지금 다시 푸니까 꽤 금방푸네? 이게 반복학습의 힘인가?