백준 20061번 모노미노도미노 2 (Python 3)

2022. 9. 2. 15:59Problem solving

Baekjoon online judge 20061번 파이썬

 

링크

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

 

20061번: 모노미노도미노 2

모노미노도미노는 아래와 같이 생긴 보드에서 진행되는 게임이다. 보드는 빨간색 보드, 파란색 보드, 초록색 보드가 그림과 같이 붙어있는 형태이다. 게임에서 사용하는 좌표 (x, y)에서 x는 행,

www.acmicpc.net

소요시간 한시간정도

복잡한 구현이지만 적혀진대로만 하면 구현할 수 있다.

move함수를 한번만 구현해서,

green, blue인 경우에 모두 사용할 수 있게 구현하였다.

(x,y)로 입력이 주어지면, green에는 x로 입력이 들어가는 것이고 blue에는 y로 입력이 들어가는것이다..

block type 1인 경우에는 green,blue 모두 type 1이고,

2인 경우에는 2,3

3인 경우에는 3,2

green, blue map을 deque으로 구현해서 잦은 appendleft에 최적화하였다.

이제 1번도 풀어봐야겠다.

소스코드

import sys
from collections import deque

input = sys.stdin.readline

green = deque([[False for _ in range(4)] for _ in range(4)])
blue = deque([[False for _ in range(4)] for _ in range(4)])
score = 0


def move(block_type, input_port, area):
    global score
    if block_type == 1:
        for i in range(4):
            if area[i][input_port]:
                new_y = i - 1
                break
            else:
                new_y = i

        if new_y == -1:
            area.pop()
            area.appendleft([False for _ in range(4)])
            area[0][input_port] = True

        else:
            area[new_y][input_port] = True

            if all(area[new_y]):
                score += 1
                del area[new_y]
                area.appendleft([False for _ in range(4)])

    elif block_type == 2:
        x1 = input_port
        x2 = input_port + 1
        for i in range(4):
            if area[i][x1] or area[i][x2]:
                new_y = i - 1
                break
            else:
                new_y = i
        if new_y == -1:
            area.pop()
            area.appendleft([False for _ in range(4)])
            area[0][x1] = True
            area[0][x2] = True
        else:
            area[new_y][x1] = True
            area[new_y][x2] = True
            if all(area[new_y]):
                score += 1
                del area[new_y]
                area.appendleft([False for _ in range(4)])

    elif block_type == 3:
        for i in range(4):
            if area[i][input_port]:
                new_y = i - 1
                break
            else:
                new_y = i

        if new_y == -1:
            area.pop()
            area.pop()
            area.appendleft([False for _ in range(4)])
            area.appendleft([False for _ in range(4)])
            area[0][input_port] = True
            area[1][input_port] = True
        elif new_y == 0:
            area[0][input_port] = True
            if all(area[0]):
                score += 1
                del area[0]
                area.appendleft([False for _ in range(4)])
                area[0][input_port] = True
            else:
                area.pop()
                area.appendleft([False for _ in range(4)])
                area[0][input_port] = True
        else:
            area[new_y][input_port] = True
            area[new_y - 1][input_port] = True
            if all(area[new_y]):
                score += 1
                del area[new_y]
                area.appendleft([False for _ in range(4)])
                if all(area[new_y]):
                  score += 1
                  del area[new_y]
                  area.appendleft([False for _ in range(4)])
            elif all(area[new_y - 1]):
                score += 1
                del area[new_y - 1]
                area.appendleft([False for _ in range(4)])
    return area


n = int(input())

for _ in range(n):
    t, y, x = map(int, input().split())

    if t == 1:
        green = move(1, x, green)
        blue = move(1, y, blue)
    elif t == 2:
        green = move(2, x, green)
        blue = move(3, y, blue)
    elif t == 3:
        green = move(3, x, green)
        blue = move(2, y, blue)

print(score)
cnt = 0
for i in range(4):
    for j in range(4):
        if green[i][j]:
            cnt += 1

        if blue[i][j]:
            cnt += 1

print(cnt)