기둥과 보 설치 - 2020 카카오 공채 (python)

SeoYng·2020년 9월 3일
5

프로그래머스, 2020 카카오 공채 코딩테스트 기출 - 기둥과 보 설치 LV3
https://programmers.co.kr/learn/courses/30/lessons/60061
시뮬레이션 해보고 설치 혹은 제거가 가능한지 매번 확인해가는 방식
set 이용, 좌표화, 추상화, 조건 체크

👀 깃헙 소스

벽면의 크기 n, 기둥과 보를 설치하거나 삭제하는 작업이 순서대로 담긴 2차원 배열 build_frame이 매개변수로 주어질 때, 모든 명령어를 수행한 후 구조물의 상태를 return 하도록 solution 함수를 완성해주세요.

입출력 예

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

솔루션
기둥, 혹은 보를 설치/제거 한후 설치된 모든 기둥과 보들이 주어진 조건에 맞게 설치되어 있는지 확인한다.
기둥 설치가 가능한경우 :
1) 맨 밑에 있는 경우
2) 설치 아래 지점에 기둥이 있는 경우
3) 설치 왼쪽 지점에 보가 있는 경우
4) 설치 지점에 보가 있는 경우
-> 모든 조건을 만족하지 않으면 설치 불가능
보 설치가 가능한경우 :
1) 설치 아래 지점에 기둥이 있는 경우
2) 설치 아래 오른쪽 지점에 기둥이 있는 경우
3) 양 옆에 보가 있는 경우
-> 모든 조건을 만족하지 않으면 설치 불가능

코드

# 파이썬
def impossible(result):
    COL, ROW = 0, 1
    for x, y, a in result:
        if a == COL: # 기둥일 때
            if y != 0 and (x, y-1, COL) not in result and \
        (x-1, y, ROW) not in result and (x, y, ROW) not in result:
                return True
        else: # 보일 때
            if (x, y-1, COL) not in result and (x+1, y-1, COL) not in result and \
        not ((x-1, y, ROW) in result and (x+1, y, ROW) in result):
                return True
    return False

def solution(n, build_frame):
    result = set()
    
    for x, y, a, build in build_frame:
        item = (x, y, a)
        if build: # 추가일 때
            result.add(item)
            if impossible(result):
                result.remove(item)
        elif item in result: # 삭제할 때
            result.remove(item)
            if impossible(result):
                result.add(item)
    answer = map(list, result)
    
    return sorted(answer, key = lambda x : (x[0], x[1], x[2]))

**팁 :
시간적인 효율성 체크는 없지만 set을 사용하면 시간을 단축시킬 수 있다.

profile
Junior Web FE Developer

2개의 댓글

comment-user-thumbnail
2021년 7월 20일

좋은 코드 배워갑니다

답글 달기
comment-user-thumbnail
2022년 3월 22일

감사합니다

답글 달기