백준 20061 모노미노도미노2

wook2·2022년 5월 21일
0

알고리즘

목록 보기
92/117

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

문제를 잘 읽고 구현하는 문제이다.
근데 구현이 복잡해 빠르게 구현을 처리하는게 관건이다.

사람들마다 각기 구현방법이 다 다른데 내가 구현한 방법을 써보겠다.

일단 블록을 놓으면 초록과 파랑이 각기 독립적이다.
그렇기 때문에 각각 따로 배열을 생성해 주었고,
파란색 배열을 오른쪽으로 이동시키는게 불편할 것 같아 파란색 배열을 90도 회전시켜 놓았다.

세팅을 해주었다면 이제 블럭을 위치 시키고 낙하해야한다.
낙하하는 과정에서 블럭이 두칸을 차지하고 낙하하는 경우를 고려해야 하는데, 나같은 경우는 1칸블럭이든 2칸블럭이든 일단 각각 블럭으로 생각해 최대한 아래까지 낙하시킨 후, 낙하한 칸이 제일 적은 칸 만큼 블럭을 이동시켰다.

블럭을 낙하 시켰다면, 각각 행을 확인하고, 열을 지워준다.
열을 지우고 해당 열 위칸부터 블럭들을 낙하시키면 된다.

n = int(input())
green = [[0]*4 for i in range(10)]
blue =  [[0]*4 for i in range(10)]
score = 0
block = 0
def setting(array,loc):
    for l in loc:
        x,y = l
        array[x][y] = 1

def move(array):
    blocks = []
    for i in range(4):
        for j in range(4):
            if array[i][j] == 1:
                blocks.append([i,j])
                array[i][j] = 0
    blocks.sort(key = lambda x:x[0], reverse=True)
    h = 10
    for i in range(len(blocks)):
        idx = 0
        x,y = blocks[i]
        while x + idx < 10 and array[x+idx][y] == 0:
            idx += 1
        h = min(h,idx)
    for i in range(len(blocks)):
        array[blocks[i][0]+h-1][blocks[i][1]] = 1

def erase(array,row,cnt):
    for i in range(cnt):
        for j in range(4):
            array[row-i][j] = 0
    for i in range(row-cnt,3,-1):
        for j in range(4):
            array[i+cnt][j] = array[i][j]
            array[i][j] = 0
def check(array):
    check_list = []
    cnt = 0
    for i in range(9,5,-1):
        if sum(array[i]) == 4:
            check_list.append(i)
    check_list.sort()
    for x in check_list:
        erase(array,x,1)
    if sum(array[5]) > 0:
        cnt += 1
    if sum(array[4]) > 0:
        cnt += 1
    if cnt > 0:
        erase(array,9,cnt)

    return len(check_list)

def count(array):
    cnt = 0
    for i in range(9,5,-1):
        for j in range(4):
            if array[i][j] == 1:
                cnt += 1
    return cnt
for i in range(n):
    t,x,y = list(map(int,input().split()))
    loc = [[x,y]]
    if t == 2:
        loc.append([x,y+1])
    elif t == 3:
        loc.append([x+1,y])
    setting(green,loc)
    for i in range(len(loc)):
        loc[i][0],loc[i][1] = loc[i][1], 3-loc[i][0]
    setting(blue,loc)
    move(green)
    move(blue)
    score += check(green)
    score += check(blue)
block += count(green)
block += count(blue)

print(score)
print(block)
profile
꾸준히 공부하자

0개의 댓글