풀이

구현 문제라 풀만하긴 한데, 코드가 깔끔히 짠다그래도 아직 부족하다. 다시한번 꼭 짜보자. 리팩토링 연습이다.

Code

# 기둥
    # 바닥 위
    # 보의 한쪽 끝 부분 위
    # 다른 기둥
# 보
    # 한쪽 끝이 기둥 위
    # 양쪽 끝부분이 다른 보와 동시에 연결
 
 
# 규칙에 맞지 않다면 설치가 되지 않음
 
# 삭제
    # 삭제 후 모든 보와 기둥은 위의 규칙을 만족해야 함
    # 만족하기 않을 경우 undo
    
# 조건
    # 명령어 build frame은 1000개
    # n은 100
    # 가로는 4
        # [x, y, a, b]
        # x, y는 교차점의 좌표
        # a는 종류 0 : 기둥, 1: 보
        # b는 설치 삭제 0: 삭제, 1설치
from pprint import pprint
 
def isColumnOk(y, x):
    global col_frame, beam_frame
    if y == floor:
        return True
    elif beam_frame[y][x-1] or beam_frame[y][x]:
        return True
    elif col_frame[y-1][x]:
        return True
    else:
        return False
 
def isBeamOk(y, x):
    global col_frame, beam_frame
    if col_frame[y-1][x] or col_frame[y-1][x+1]:
        return True
    elif beam_frame[y][x-1] and beam_frame[y][x+1]:
        return True
    else:
        return False
 
def isAllOk():
    global col_frame, beam_frame
    for y in range(len(col_frame)):
        for x in range(len(col_frame)):
            if col_frame[y][x] is not None:
                if not isColumnOk(y, x):
                    return False
            if beam_frame[y][x] is not None:
                if not isBeamOk(y, x):
                    return False
    return True
 
def transform2Answer():
    global col_frame, beam_frame
    ret = []
    for y in range(len(col_frame)):
        for x in range(len(col_frame)):
            if col_frame[y][x] is not None:
                ret.append([x, y, column])
            if beam_frame[y][x] is not None:
                ret.append([x, y, beam])
    ret.sort(key=lambda x: (x[0], x[1], x[2]))
    return ret
 
column, beam = 0, 1
deleting, building = 0, 1
floor = 0
def solution(n, build_frame):
    global col_frame, beam_frame
    col_frame = [[None for _ in range(n+1)] for _ in range(n+1)]
    beam_frame = [[None for _ in range(n+1)] for _ in range(n+1)]
    
    for x, y, struct_type, build_type in build_frame:
 
        if build_type == building:
            if struct_type == column:
                if isColumnOk(y, x):
                    col_frame[y][x] = 1
            elif struct_type == beam:
                if isBeamOk(y, x):
                    beam_frame[y][x] = 1
        elif build_type == deleting:
            if struct_type == column:
                col_frame[y][x] = None
            elif struct_type == beam:
                beam_frame[y][x] = None
                
            if not isAllOk():
                if struct_type == column:
                    col_frame[y][x] = 1
                elif struct_type == beam:
                    beam_frame[y][x] = 1
    return transform2Answer()

Reference