💻 링크
https://school.programmers.co.kr/learn/courses/30/lessons/60061

📖 문제 해결
문제에서 제시한 대로 코드를 작성해 나가면 해결할 수 있는 시뮬레이션 유형의 문제입니다. 주어진 build_frame내의 frame에 대해 제시된 행위(설치 혹은 삭제)를 우선 해본 후 설치 규칙에 위배되지 않는다면 그대로 진행하고, 만약 위배된다면 제시된 행위(설치 혹은 삭제)를 하기 이전의 상태로 돌아가도록 코드를 작성하여 문제를 해결하였습니다.

def build_test(frame_list):
    
    # 리스트 내의 모든 프레임에 대하여 검사
    for frame in frame_list:
        
        # '기둥'이라면
        if frame[2] == 0:
            
            # 만약 기둥의 좌표가 (x,0)이라면 가능한 구조물
            if frame[1] == 0:
                continue
            
            # 혹은 그 아래에 기둥이 있는 경우 가능한 구조물
            elif [frame[0],frame[1]-1,0] in frame_list:
                continue
            
            # 혹은 아래에 받칠 수 있는 보가 있는 경우 가능한 구조물
            elif [frame[0]-1,frame[1],1] in frame_list or [frame[0],frame[1],1] in frame_list:
                continue
            
            # 위의 경우가 아니라면 불가능한 구조물이므로 False 반환
            else:
                return False
        
        # '보'라면
        else:
            
            # 한 쪽에 기둥이 있다면 가능한 구조물
            if [frame[0],frame[1]-1,0] in frame_list or [frame[0]+1,frame[1]-1,0] in frame_list:
                continue
            
            # 양쪽에 보가 있다면 가능한 구조물
            elif [frame[0]-1,frame[1],1] in frame_list and [frame[0]+1,frame[1],1] in frame_list:
                continue
            
            # 위의 경우가 아니라면 불가능한 구조물이므로 False 반환
            else:
                return False
            
    
    # 검사 후에 이상이 없다면 True 반환
    return True

def solution(n, build_frame):
    result = []
    
    for frame in build_frame:
        
        # '삭제'라면
        if frame[3] == 0:
            
            # 우선 삭제를 해본 후
            result.remove(frame[:3])
            
            # 가능한 구조물이면 그대로 진행
            if build_test(result):
                continue
            
            # 불가능한 구조물이면 다시 삭제 이전의 상태로 돌려놓기
            else:
                result.append(frame[:3])

        # '설치'라면
        else:
            
            # 우선 설치를 해본 후
            result.append(frame[:3])
            
            # 가능한 구조물이면 그대로 진행
            if build_test(result):
                continue
            
            # 불가능한 구조물이면 다시 설치 이전의 상태로 돌려놓기
            else:
                result.remove(frame[:3])
    
    # 만들어진 result list를 정렬
    result.sort()
    
    return result
profile
AI를 공부하고 있는 학생입니다:)

0개의 댓글