[programmers] 기둥과 보 설치 (python)

zioo·2022년 6월 18일
0
post-custom-banner

프로그래머스, 2020 카카오 공채 코딩테스트 기출 - 기둥과 보 설치 LV3
https://programmers.co.kr/learn/courses/30/lessons/60061

solution

기둥, 혹은 보를 설치/제거 한후 설치된 모든 기둥과 보들이 주어진 조건에 맞게 설치되어 있는지 확인한다.

기둥 설치가 가능한경우

1) 맨 밑에 있는 경우
2) 설치 아래 지점에 기둥이 있는 경우
3) 설치 왼쪽 지점에 보가 있는 경우
4) 설치 지점에 보가 있는 경우
-> 모든 조건을 만족하지 않으면 설치 불가능

보 설치가 가능한경우

1) 설치 아래 지점에 기둥이 있는 경우
2) 설치 아래 오른쪽 지점에 기둥이 있는 경우
3) 양 옆에 보가 있는 경우
-> 모든 조건을 만족하지 않으면 설치 불가능

comment

처음에는 check 함수의
if y == 0 or [x-1, y, 1] in answer or [x, y, 1] in answer or [x, y-1, 0] in answer 문을 True 로 return 했는데 for 문을 돌고 있기 때문에 하나라도 만족하면 True 가 되어 버렸다.

반복문으로 모든 보와 기둥을 체크 해야하므로 continue를 써줘야 한다.

code

def check(answer):
    for frame in answer:
        x, y, a = frame
        if a == 0:  # 기둥
            if y == 0 or [x-1, y, 1] in answer or [x, y, 1] in answer or [x, y-1, 0] in answer:
                continue
            else:
                return False
        elif a == 1:
            if [x, y-1, 0] in answer or [x+1, y-1, 0] in answer or ([x-1, y, 1] in answer and [x+1, y, 1] in answer):
                continue
            else:
                return False
    return True

def solution(n, build_frame):
    answer = []

    for f in build_frame:
        x, y, what, how = f

        if how == 1:  # 설치
            answer.append([x, y, what])
            if check(answer) is False:
                answer.remove([x, y, what])
        else:  # 삭제
            answer.remove([x, y, what])
            if check(answer) is False:
                answer.append([x, y, what])

    answer.sort()

    print(answer)
    return answer


solution(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]])
post-custom-banner

0개의 댓글