본문 바로가기

프로그래머가 되자!!!!/알고리즘 공부!

[프로그래머스] 기둥과 보 설치 (python) (2020 KAKAO BLIND RECRUITMENT)

풀이

카카오 기출문제답게, 구현문제이다. 풀이해보면 알겠지만 로직이 어렵거나 한 부분은 없다. 심지어 예외처리도 문제에서 많이 해주고 있기 때문에 간단하다면 간단하다!!
나는 각각 보와 기둥일 때, 그리고 설치 / 삭제를 나누어 생각하여 총 4가지의 함수를 만들었다.
보 설치 / 삭제, 기둥 설치 / 삭제 함수를 만들고
해당하는 경우마다 함수를 호출하여 설치 / 삭제가 가능한지 판별하였다.

로직은 문제에 명시된 것을 코드로 옮기는 느낌이라 코드를 보면서 이해하는게 더 편할 것 같다.

 

 

코드

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

    pil_graph = [[0] * (n + 1) for _ in range(n + 1)]
    bo_graph = [[0] * (n + 1) for _ in range(n + 1)]

    for i in range(len(build_frame)):
        x, y, is_bo, is_install = build_frame[i]
        if is_install:
            if is_bo:
                if bo_install(x, y):
                    bo_graph[x][y] = 1
                    answer.append([x, y, 1])
            else:
                if pil_install(x, y):
                    pil_graph[x][y] = 1
                    answer.append([x, y, 0])
        else:
            if is_bo:
                if bo_remove(x, y):
                    answer.remove([x, y, 1])
            else:
                if pil_remove(x, y):
                    answer.remove([x, y, 0])
    answer.sort(key=lambda x:(x[0], x[1], x[2]))
    return answer


def bo_install(x, y):
    if pil_graph[x][y - 1] == 1 or pil_graph[x + 1][y - 1]:
        return True
    if bo_graph[x - 1][y] == 1 and bo_graph[x + 1][y] == 1:
        return True

    return False

def pil_install(x, y):
    if y == 0:
        return True

    if pil_graph[x][y - 1] == 1:
        return True

    if bo_graph[x][y] == 1:
        return True

    if bo_graph[x - 1][y] == 1:
        return True

    return False

def bo_remove(x, y):
    bo_graph[x][y] = 0
    answer = True
    if bo_graph[x - 1][y] == 1:
        if not bo_install(x - 1, y):
            answer = False

    if bo_graph[x + 1][y] == 1:
        if not bo_install(x + 1, y):
            answer = False

    if pil_graph[x][y] == 1:
        if not pil_install(x, y):
            answer = False

    if pil_graph[x + 1][y] == 1:
        if not pil_install(x + 1, y):
            answer = False

    if not answer:
        bo_graph[x][y] = 1
        return answer

    return answer

def pil_remove(x, y):
    pil_graph[x][y] = 0
    answer = True
    if bo_graph[x][y + 1] == 1:
        if not bo_install(x, y + 1):
            answer = False

    if bo_graph[x - 1][y + 1] == 1:
        if not bo_install(x - 1, y + 1):
            answer = False

    if pil_graph[x][y + 1] == 1:
        if not pil_install(x, y + 1):
            answer = False

    if not answer:
        pil_graph[x][y] = 1
        return answer

    return answer