본문 바로가기
Programming/Programmers

[프로그래머스] 기둥과 보 설치 (Python)

by 데이터현 2021. 11. 15.

https://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 impossible(answer):
    column , girder = 0, 1
    for a in answer:
        x, y, item = a
        if item == column:
            # 기둥
            if y != 0 and (x,y-1,column) not in answer and (x-1,y,girder) not in answer and (x,y,girder) not in answer:
                return True
        else:
            # 보
            if (x,y-1,column) not in answer and (x+1,y-1,column) not in answer and not ((x-1,y,girder) in answer and (x+1,y,girder) in answer):
                return True
    return False
            
def solution(n, build_frame):
    answer = set()
    for frame in build_frame:
        x, y, item, how = frame
        if how == 1:
            # 설치
            answer.add((x,y,item))
            if impossible(answer):
                answer.remove((x,y,item))
        else:
            # 제거
            answer.remove((x,y,item))
            if impossible(answer):
                answer.add((x,y,item))
    return sorted(list(answer), key = lambda x: (x[0],x[1],x[2]))

추가로 set에 여러 친구들을 넣을 때에는 튜플 형식만 가능하다.

 

댓글