[프로그래머스 Lv3.]기둥과 보 설치(python)

gayoung·2022년 4월 4일
0

알고리즘

목록 보기
13/48

1. 문제

문제 설명

제한사항

입출력

입출력 예시


2. 풀이 과정

내가 생각한 진행 과정

  1. 설치
    • 일단 answer에 넣는다.(append)
    • check함수에서 설치 여부 확인
    • answer을 돌면서 설치되어도 괜찮으면 True, 조건에 맞지않으면 False 리턴
    • False가 리턴되었다면, 설치할 수 없다는 의미이므로 뺀다.(remove)
  2. 삭제
    • 일단 answer에서 뺀다.(remove)
    • check함수에서 삭제 여부 확인
    • answer을 돌면서 안에 있는 것들이 기둥 또는 보를 세우는 조건에 맞지 않으면(False) 방금 remove한 애들이 있어야 설치가 된다는 의미이므로 넣는다.(append)

코드

def check(answer):
    for x, y, a in answer:
        # 기둥이 가능한 경우
        # 1) 바닥 위에 있기
        # 2) 보의 한쪽 끝 부분 위에 있기
        # 3) 다른 기둥 위에 있기
        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:  # 설치 성공, 삭제 실패
                # print("기둥one")
                pass  # 기둥 설치 - 가능
                      # 기둥 제거 - 불가능
            else:
                # print("기둥two")
                return False  # 설치실패, 삭제 성공

        # 보가 가능한 경우
        # 1) 한쪽 끝 부분이 기둥 위에 있기
        # 2) 양쪽 끝 부분이 다른 보와 동시에 연결되어 있기
        if a == 1:
            # print(x, y, a)
            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):
                # print("보one")
                pass  # 보 설치 - 가능
                      # 보 삭제 - 불가능
            else:
                # print("보two")
                return False  # 보 설치 - 불가능

    return True  # 기둥이나 보 설치 - 온전하게 가능

def solution(n, build_frame):
    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])
            # print(answer)

        else:  # 삭제
            answer.remove([x, y, a])
            if check(answer) is False:  # 만약, 빼도 무관하다면 remove된 상태로 유지
                                        # 만약, 빼면 절대로 안된다면 remove다시 append해주기
                answer.append([x, y, a])

    return sorted(answer)

0개의 댓글