[백준] 20061번 모노미노도미노2

HL·2021년 4월 21일
0

백준

목록 보기
78/104
post-custom-banner

문제 링크

https://www.acmicpc.net/problem/20061

문제 설명

  • 빨간색에 놓으면 초록색, 파란색 board에 테트리스
  • 연한 구역에 쌓이면 맨 끝에 있는 줄 삭제

풀이

  • 파란색 부분을 뒤집어서 초록색 부분이랑 똑같이 저장

후기

  • 깔끔하게 풀려고 하니까 속도가 느려지기만 한다
  • 코드 좀 길어져도 일일이 써주는게 좋을 때도 있는 것 같다

코드

def get_block(t, y, x, isBlue):
    if isBlue:
        if t == 1:
            return [[0, y]]
        if t == 2:
            return [[0, y], [1, y]]
        if t == 3:
            return [[0, y], [0, y+1]]
    else:
        if t == 1:
            return [[0, x]]
        if t == 2:
            return [[0, x], [0, x+1]]
        if t == 3:
            return [[0, x], [1, x]]
        

def set_block(board, block):
    curr = []
    for i in range(len(block)-1, -1, -1):
        curr.append(block[i])
    while True:
        can_down = True
        for y, x in curr:
            if not (y <= 4 and board[y+1][x] == 0):
                can_down = False
        if can_down:
            for i in range(len(curr)):
                curr[i][0] += 1
        else:
            break
    for y, x in curr:
        board[y][x] = 1


def down_filled(board):
    filled = [0] * 6
    for i in range(6):
        if sum(board[i]) == 4:
            filled[i] = 1
    y1, y2 = 5, 5
    while y1 >= 0 and y2 >= 0:
        if filled[y1]:
            y1 -= 1
        else:
            board[y2] = board[y1][:]
            y1 -= 1
            y2 -= 1
    return sum(filled)


def down_out(board):
    out = 0
    for i in range(2):
        if sum(board[i]) > 0:
            out += 1
    y1, y2 = 5 - out, 5
    while y1 >= 0 and y2 >= 0:
        board[y2] = board[y1][:]
        y1 -= 1
        y2 -= 1
    board[0] = [0,0,0,0]
    board[1] = [0,0,0,0]
    

# init
import sys
read = sys.stdin.readline
n = int(read())
info = [list(map(int, read().split())) for _ in range(n)]
board = [
    [[0]*4 for _ in range(6)],
    [[0]*4 for _ in range(6)],
]

# start
score = 0
for t, y, x in info:
    for i in range(2):
        block = get_block(t, y, x, i)
        set_block(board[i], block)
        score += down_filled(board[i])
        down_out(board[i])
count = 0
for i in range(2):
    for j in range(6):
        for k in range(4):
            if board[i][j][k]:
                count += 1
print(score)
print(count)
profile
Frontend 개발자입니다.
post-custom-banner

0개의 댓글