찔끔찔끔씩😎

[프로그래머스] 기둥과 보 설치 - python (2020 카카오 블라인드 코딩테스트) 본문

Algorithm/프로그래머스

[프로그래머스] 기둥과 보 설치 - python (2020 카카오 블라인드 코딩테스트)

댕경 2021. 11. 8. 23:16
728x90

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


문제

기둥, 보를 조건에 맞게 설치하자!

 

< 기둥 설치가 가능한 경우 >
1) 바닥에 있는 경우
2) 설치 왼쪽 지점에 보가 있는 경우
3) 설치 아래 지점에 기둥이 있는 경우
4) 설치 지점에 보가 있는 경우

 

< 보 설치가 가능한 경우 >

1) 설치 양옆에 보가 있는 경우
2) 설치 양옆 중 하나에 기둥이 잇는 경우


코드

def possible (result):
    for x,y,a in result:
        if a == 0: # 기둥
            if y == 0 or (x-1,y,1) in result or (x,y-1,0) in result or (x,y,1) in result:
           # 바닥에 있거나 or 보의 한쪽 끝에 있거나 or 다른기둥위에있거나 or 보위에 있으면
                continue
            else:
                return False

        elif a == 1: # 보
            if ( (x-1,y,1) in result and (x+1,y,1) in result ) or ( (x,y-1,0) in result or (x+1,y-1,0) in result):
           # ( 양쪽 끝부분이 동시에 연결되어 있거나 ) or ( 보의 한쪽 끝부분이 기둥위에 있으면 ) 
                continue
            else:
                return False
    
    return True 

def solution(n, build_frame):
    result = set() 

    for (x,y,a,b) in build_frame:
        new = (x,y,a)
        if b == 1: # 설치
            result.add(new)
            if not possible(result): # 설치한게 불가능한 구조면
                result.remove(new) # 다시 삭제

        elif b==0 and new in result:
            result.remove(new) # 삭제
            if not possible(result): # 삭제한게 불가능한 구조면
                result.add(new) # 다시 설치

    answer = map(list,result)
    return sorted(answer)
Comments