boj 20061 모노미노도미노2 (골드2)

김준오·2022년 4월 28일
0

알고리즘

목록 보기
88/91
post-thumbnail

문제

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

내 풀이

n = int(input())

blue = [[0] * 6 for _ in range(4)]
green = [[0] * 4 for _ in range(6)]

def place(t, y, x, k):
    if t == 1:
        col = 0
        while(col <= 5):
            if blue[y][col] == 0:
                col += 1
            else:
                break

        blue[y][col-1] = k

        row = 0
        while(row <= 5):
            if green[row][x] == 0:
               row += 1
            else :
                break

        green[row-1][x] = k

    elif t == 2:
        col = 0
        while(col < 5):
            if blue[y][col] == 0 and blue[y][col+1] == 0:
                col += 1
            else:
                break

        blue[y][col-1], blue[y][col] = k, k

        row = 0
        while(row <= 5):
            if green[row][x] == 0 and green[row][x+1] == 0:
                row += 1
            else:
                break

        green[row-1][x], green[row-1][x+1] = k, k

    elif t == 3:
        col = 0
        while(col <= 5):
            if blue[y][col] == 0 and blue[y+1][col] == 0:
                col += 1
            else :
                break
        blue[y][col-1], blue[y+1][col-1] = k, k

        row = 0
        while(row < 5):
            if green[row][x] == 0 and green[row+1][x] == 0:
                row += 1

            else:
                break

        green[row-1][x], green[row][x] = k, k



def print_blue():
    for y in range(4):
        for x in range(6):
            print(blue[y][x], end=' ')
        print()
    print()


def print_green():
    for y in range(6):
        for x in range(4):
            print(green[y][x], end=' ')
        print()
    print()

def get_score():
    global score
    global green
    global blue
    i = 5
    while(i > 0):
        flag = True
        for j in range(4):
            if green[i][j] == 0 :
                flag = False
                i -= 1
                break
        if flag:
            score += 1

            ## 삭제된 행 윗부분 이동
            for r in range(i,0,-1):
                for c in range(4):
                    green[r][c] = green[r-1][c]

            ## 맨 윗행 0으로 초기화
            for k in range(4):
                green[0][k] = 0

    i = 5
    while(i > 0):
        flag = True
        for j in range(4):
            if blue[j][i] == 0:
                i -= 1
                flag = False
                break
        if flag:
            score += 1

            ## 삭제된 열 왼쪽부분 오른쪽으로 이동
            for r in range(4):
                for c in range(i,0,-1):
                    blue[r][c] = blue[r][c-1]


            ## 맨 왼쪽행 0으로 초기화
            for k in range(4):
                blue[k][0] = 0

def check_special():
    green_cnt = 0
    blue_cnt = 0
    global blue
    global green

    for i in range(2):
        for j in range(4):
            if green[i][j] > 0:
                green_cnt += 1
                break

    for i in range(2):
        for j in range(4):
            if blue[j][i] > 0:
                blue_cnt += 1
                break

    ## 파란색 오른쪽으로 이동
    temp_blue = [[0] * 6 for _ in range(4)]
    for i in range(4):
        for j in range(6-blue_cnt):
            temp_blue[i][j+blue_cnt] = blue[i][j]

    blue = [temp_blue[i][:] for i in range(4)]

    ## 초록색 아래로 이동
    temp_green = [[0] * 4 for _ in range(6)]
    for i in range(6-green_cnt):
        for j in range(4):
            temp_green[i+green_cnt][j] = green[i][j]

    green = [temp_green[i][:] for i in range(6)]

score = 0
for k in range(1,n+1):
    t, y, x = map(int,input().split())
    place(t, y, x, k)
    get_score()
    check_special()

print(score)

block_cnt = 0
for i in range(4):
    for j in range(6):
        if blue[i][j] > 0:
            block_cnt += 1


for i in range(6):
    for j in range(4):
        if green[i][j] > 0:
            block_cnt += 1

print(block_cnt)

주의점

점수를 얻는부분에서 조건을 만족하면 칸을 비우는 방식으로 for문으로 돌리게끔 짰는데
한턴에 두줄이 동시에 사라지는 상황일경우 맵이 변화한 상태로 다음턴에 들어가므로 index가 꼬이는상황이 나오기에 while로 바꾸고 쭉 체크하게끔 바꾸었다.

블록의 모양따라서 처음으로 해당 블록이 들어갈수 없는 상황일때 해당 인덱스를 기억하고 그 바로 앞 인덱스에 맞춰넣는방식을 선택했다.

그냥 x,y만 바꾸면 블루 그린 같은 매커니즘 이므로 하나로 통합해서 짤까 하다가
실전이었으면 불안해서 그냥 직관적으로 주어진대로 짰을거같아서 그렇게 해봤다

그래서 코드양이 꽤나 길어졌다

profile
jooooon

0개의 댓글

관련 채용 정보