기둥과 보 설치 - 2020 카카오 신입 공채

구기성·2023년 1월 3일
0

알고리즘

목록 보기
10/31





기둥과 보 설치

이 문제는 2020 카카오 신입 공채에서 나온 문제이다. 위 문제는 벽면의 크기가 N이고 기둥과 보를 설치하거나 삭제하는 작업이 순서대로 담긴 2차원 배열인 build_frame이 매개변수로 주어진다. 모든 명령어들을 수행하고 구조물의 상태를 return하면 된다.

여기서 내가 가져간 방식은 제거하는 명령어가 온다면 제거를 한다. 그 다음 올바른 구조물인지 체크를 한다.
또 설치하는 명령어가 온다면 설치를 한다. 그 다음 올바른 구조물인지 체크를 한다.
즉, 우선 설치하거나 삭제하고 올바른지 체크를 하는 것이다.

그런데 설치 or 제거를 할 때 기둥과 보에 대해서 올바른 구조물 체크하는 방식이 다르다.
설치 or 제거할때 기둥이 가능한 경우는 다음과 같다.
1. 기둥이 맨 밑에 있는 경우
2. 보의 오른쪽 끝부분에 연결된 경우
3. 보의 왼쪽 끝부분에 연결된 경우
4. 다른 기둥의 위인 경우

보의 경우는 다음과 같다.
1. 보의 왼쪽 끝이 기둥과 연결되어 있는 경우
2. 보의 오른쪽 끝이 기둥과 연결되어 있는 경우
3. 다른 보들 사이에 연결되어 있는 경우

그래서 올바른 구조물을 체크하는 함수인 possible()을 만들어 줬다.
내가 설계한 코드는 아래와 같다.

def possible(answer):  # 가능한지 체크하는 함수
    for x, y, structure in answer:
        if structure == 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
            return False
        elif structure == 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
            return False
    return True


def solution(n, build_frame):
    answer = []
    for item in build_frame:
        x, y = item[0], item[1]

        if item[3] == 1:  # 설치하는 경우
            answer.append([x, y, item[2]])  # 우선 삽입
            if not possible(answer):  # 불가능한 경우
                answer.remove([x, y, item[2]])  # 다시 제거

        elif item[3] == 0:  # 제거하는 경우
            answer.remove([x, y, item[2]])  # 우선 제거
            if not possible(answer):  # 불가능한 경우
                answer.append([x, y, item[2]])  # 다시 삽입

    answer.sort()  # 정렬
    return answer

print(solution(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]]))
print(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]]))

0개의 댓글