기둥과 보 설치 [프로그래머스 60061]

오준혁·2023년 5월 26일
0

알고리즘

목록 보기
20/29

문제


기둥과 보 설치 [프로그래머스 60061]
https://school.programmers.co.kr/learn/courses/30/lessons/60061

풀이


key point

  • 굳이 2차원 배열 만들어 그림을 구현하려 하지 말고 1차원적으로 괜찮으면 정보를 설치 제거 식으로 한다.
  • 문제에서 주어지는 조건을 잘 생각해서 구현할 것

전형적인 시뮬레이션 문제로 입력 리스트를 하나씩 검사한다. 설치일 경우 일단 설치 후 문제 없는 지 검사하고 이상이 있으면 다시 원복하는 식으로 진행한다. 제거의 경우에도 선 제거 후 검사 이상 시 원복 순서로 코드를 작성하였다. 설치와 제거를 어떤 식으로 할 지에서 많이 고민했다. 처음에는 2차원 배열로 그림을 구현하려고만 했는데 그러려고하니 교차점에서 겹치는 구조물 중 하나는 누락되는 문제가 생겼다. 답지를 확인하니 그냥 answer 리스트에 추가 제거만 해주어도 문제가 없었다.

검사하는 부분은 따로 함수를 작성하였다. 검사(이 후 check)함수에서는 answer 리스트 전체를 검사하며 문제가 있는 지 없는 지를 확인하는 함수를 작성하였다.

코드


def check(answer):
    for x, y, stuff in answer:
        if stuff == 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
        else:           # 보인 경우
            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):
    board = [[2] * (n + 1) for _ in range(n + 1)]
    answer = []
    for x, y, a, b in build_frame:
        if b == 1:
            answer.append([x, y, a])
            if not check(answer):
                answer.remove([x, y, a])
        if b == 0:
            answer.remove([x, y, a])
            if not check(answer):
                answer.append([x, y, a])
                
    return sorted(answer)

0개의 댓글