[BOJ] 20061. 도노미노도미노2 (🥇, 시뮬레이션)

lemythe423·2023년 11월 27일
0

BOJ 문제풀이

목록 보기
74/133
post-thumbnail

🔗

풀이

유사 테트리스인데 이제 행과 열 둘 다로 움직인다.
그림에서와 같이 빨간칸에 블럭이 생기면 아래에 있는 초록칸과 오른쪽에 있는 파란칸으로 블럭이 이동하게 된다.

이동한 블럭들로 인해서 초록칸의 경우 하나의 행이, 파란칸의 경우 하나의 열이 블럭으로 차게 될 경우 테트리스처럼 한 행, 한 열이 사라지게 된다. 하나의 행과 하나의 열이 사라질 때마다 각각 1점씩 획득한다.

2차원 배열을 다룰 때는 열을 삭제하는 것보다는 행을 삭제하는 게 편하기 때문에 파란칸을 90도 회전시켜서 초록칸의 형태로 만들어서 구현했다. 빨간칸에서 블럭이 이동할 때 초록칸과 파란칸에 각각 행, 열의 값을 반대로 넘겨주면 된다.

# 도노미노도미노 2

def block_one(arr, col):
	row = 0
	while row < 6:
		if arr[row][col] == 1:
			break
		row += 1
	arr[row-1][col] = 1

def block_two(arr, col):
	row = 0
	while row < 6:
		if arr[row][col] == 1 or arr[row][col+1] == 1:
			break
		row += 1
	arr[row-1][col] = 1
	arr[row-1][col+1] = 1

def block_three(arr, col):
	row = 0
	while row < 5:
		if arr[row][col] == 1 or arr[row+1][col] == 1:
			break
		row += 1
	arr[row-1][col] = 1
	arr[row][col] = 1
	
def row_clean(arr):
	global score
	for i in range(5, -1, -1):
		if all(arr[i]):
			arr.pop(i)
			score += 1

def full_arr(arr):
	l = len(arr)
	for _ in range(6 - l):
		arr.insert(0, [0] * 4)

def row_clean2(arr):
	for i in range(2):
		if any(arr[i]):
			arr.pop()

def count_block(arr):
	global total_count
	for row in arr:
		total_count += row.count(1)

func = {
	1: lambda x: block_one(*x),
	2: lambda x: block_two(*x),
	3: lambda x: block_three(*x)
}

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

score = total_count = 0
for _ in range(N):
	t, x, y = map(int, input().split())
	
	if t == 1:
		func[1]((green, y))
		func[1]((blue, x))
	elif t == 2:
		func[2]((green, y))
		func[3]((blue, x))
	else:
		func[3]((green, y))
		func[2]((blue, x))

	row_clean(green)
	full_arr(green)
	row_clean2(green)
	full_arr(green)

	row_clean(blue)
	full_arr(blue)
	row_clean2(blue)
	full_arr(blue)

count_block(green)
count_block(blue)

print(score)
print(total_count)
print()
profile
아무말이나하기

0개의 댓글