백준 20061번 모노미노도미노 2 (Python 3)
2022. 9. 2. 15:59ㆍProblem 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)
'Problem solving' 카테고리의 다른 글
백준 1339번 단어 수학 (Python 3) (0) | 2022.09.08 |
---|---|
백준 1062번 가르침 (Python 3) (0) | 2022.09.08 |
백준 16234번 인구 이동 (Python 3) (0) | 2022.09.02 |
백준 17837번 새로운 게임 2 (Python 3) (0) | 2022.09.01 |
백준 17780번 새로운 게임 (Python 3) (0) | 2022.09.01 |