[Programmers/프로그래머스] 2020 KAKAO BLIND RECRUITMENT 기둥과 보 설치 - Python/파이썬 [해설/풀이]

SihoonCho·2022년 9월 23일
0
post-thumbnail
[Programmers/프로그래머스] 2020 KAKAO BLIND RECRUITMENT [코딩테스트]
  1. [Lv. 2] 문자열 압축
  2. [Lv. 2] 괄호 변환
  3. [Lv. 3] 자물쇠와 열쇠
  4. [Lv. 4] 가사 검색
  5. [Lv. 3] 기둥과 보 설치
  6. [Lv. 3] 외벽 점검
  7. [Lv. 3] 블록 이동하기

📌 문제


📝 제한사항


💻 입출력 예


📖 입출력 예에 대한 설명


📌 풀이


📖 해설


# Pseudo 코드
def possible(answer):
    for x, y, a in answer:                      # 모든 구조물[가로좌표, 세로좌표, 구조물]에 대해
        if a == 0:		                            # 기둥 설치조건 확인
            if y == 0: continue                     # 현재 기둥이 바닥 위에 있으면 continue
            elif [x, y, 1] in answer: continue      # 현재 기둥이 보의 왼쪽 끝에 있으면 continue
            elif [x - 1, y, 1] in answer: continue  # 현재 기둥이 보의 오른쪽 끝에 있으면 continue
            elif [x, y - 1, 0] in answer: continue  # 현재 기둥이 다른 기둥 위에 있으면 continue
            else: return False                      # 현재 기둥이 위의 어느것도 해당되지 않으면 return False
        if a == 1:                                      # 보 설치조건 확인
            if [x, y - 1, 0] in answer: continue        # 현재 보의 왼쪽 끝이 기둥 위에 있으면 continue
            elif [x + 1, y - 1, 0] in answer: continue  # 현재 보의 오른쪽 끝이 기둥 위에 있으면 continue
            elif [x - 1, y, 1] in answer:               # 현재 보의 왼쪽 끝이 다른 보와 연결되어 있고
                if [x + 1, y, 1] in answer:                 # 현재 보의 오른쪽 끝이 다른 보와 연결되어 있으면
                    continue                                    # continue
            else: return False                          # 현재 보가 위의 어느것도 해당되지 않으면 return False
    return True                                 # 모든 구조물이 설치조건을 만족하면 return True

💻 전체코드


def possible(answer):
    for x, y, architecture in answer:
        if architecture == 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
        if architecture == 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 x, y, a, b in build_frame:
        if b == 0:							# 삭제
            answer.remove([x, y, a])		# [가로좌표, 세로좌표, 구조물]
            if not possible(answer):		# 삭제가 불가능하면
                answer.append([x, y, a])	# 원래상태로 복구
                
        if b == 1:							# 설치
            answer.append([x, y, a])		# [가로좌표, 세로좌표, 구조물]
            if not possible(answer):		# 설치가 불가능하면
                answer.remove([x, y, a])	# 원래상태로 복구
    
    return sorted(answer)
profile
개발을 즐길 줄 아는 백엔드 개발자

0개의 댓글