Gold 2
20061번: 모노미노도미노 2
모노미노도미노는 아래와 같이 생긴 보드에서 진행되는 게임이다. 보드는 빨간색 보드, 파란색 보드, 초록색 보드가 그림과 같이 붙어있는 형태이다. 게임에서 사용하는 좌표 (x, y)에서 x는 행,
www.acmicpc.net
문제 풀이
1) 파란색 보드와 초록색 보드를 따로 만든다.
2) 조각이 놓여졌을 때 파란보드로 이동하면 행이 그대로일 것이고, 초록보드로 이동하면 열이 그대로일 것이다.
빈칸이 아니거나 범위를 벗어나기 전까지 좌표를 이동시키고 각 보드에 넣어준다.
3) 조각이 자리에 채워지면 꽉찬 라인을 확인하고 삭제시킨다.
4) 0, 1번째 라인에 블록이 있으면 한줄 삭제한다.
코드
n = int(input())
green_board = [[0] * 4 for _ in range(6)]
blue_board = [[0] * 6 for _ in range(4)]
block_list = [[(0, 0)], [(0, 0), (0, 1)], [(0, 0), (1, 0)]]
def blue(x, block_):
temp_y, check = 0, True
while True:
if 0 <= temp_y < 6:
for i in range(len(block_list[block_-1])):
b = block_list[block_-1][i]
# 모든 점이 다 0이어야 함
if temp_y + b[1] >= 6 or blue_board[x + b[0]][temp_y + b[1]] != 0:
check = False
else: break
if not check: break
temp_y += 1
return x, temp_y - 1
def green(y, block_):
temp_x, check = 0, True
while True:
if 0 <= temp_x < 6:
for i in range(len(block_list[block_-1])):
b = block_list[block_-1][i]
if temp_x + b[0] >= 6 or green_board[temp_x + b[0]][y + b[1]] != 0:
check = False
else: break
if not check: break
temp_x += 1
return temp_x - 1, y
def remove_blue(idx):
for i in range(idx, 0, -1):
for j in range(4):
blue_board[j][i] = blue_board[j][i-1]
for i in range(4):
blue_board[i][0] = 0
def remove_green(idx):
for i in range(idx, 0, -1):
for j in range(4):
green_board[i][j] = green_board[i-1][j]
for i in range(4):
green_board[0][i] = 0
score = 0
for _ in range(n):
# 파란색은 x 그대로 / 초록색은 y 그대로
block, x, y = map(int, input().split())
answer_b, answer_g = blue(x, block), green(y, block)
# 블록 채우기
for i in range(len(block_list[block-1])):
b = block_list[block - 1][i]
blue_board[answer_b[0] + b[0]][answer_b[1] + b[1]] = 1
green_board[answer_g[0] + b[0]][answer_g[1] + b[1]] = 1
# 꽉찬 라인 삭제하기
del_green = []
for i in range(2, 6):
if sum(green_board[i]) == 4:
score += 1
del_green.append(i)
del_blue = []
for i in range(2, 6):
sum_ = 0
for j in range(4):
if blue_board[j][i] == 1:
sum_ += 1
if sum_ == 4:
score += 1
del_blue.append(i)
for r in del_green: remove_green(r)
for r in del_blue: remove_blue(r)
# 0, 1번째 라인에 블록이 있으면 특수 처리
for i in range(2):
for j in range(4):
if blue_board[j][i]:
remove_blue(5)
break
for i in range(2):
for j in range(4):
if green_board[i][j]:
remove_green(5)
break
# 점수 계산
print(score)
count = 0
for i in range(4):
for j in range(6):
if blue_board[i][j] == 1:
count += 1
for i in range(6):
for j in range(4):
if green_board[i][j] == 1:
count += 1
print(count)
느낀점
for문 지옥
인덱스를 받아서 한줄씩 삭제하는 코드는 자주 쓰일 것 같다.
728x90
'Algorithm > Problem' 카테고리의 다른 글
[Baekjoon] 17822번 : 주사위 윷놀이 - Python (2) | 2022.03.31 |
---|---|
[Baekjoon] 19236번 : 청소년 상어 - Python (2) | 2022.03.24 |
[Baekjoon] 15685번 : 드래곤 커브 - Python (0) | 2022.03.04 |
[Baekjoon] 17142번 : 연구소 3 - Python (0) | 2022.02.25 |
[Baekjoon] 23288번 : 주사위 굴리기 2 - Python (0) | 2022.02.22 |