1. 문제
20061번: 모노미노도미노 2
모노미노도미노는 아래와 같이 생긴 보드에서 진행되는 게임이다. 보드는 빨간색 보드, 파란색 보드, 초록색 보드가 그림과 같이 붙어있는 형태이다. 게임에서 사용하는 좌표 (x, y)에서 x는 행,
www.acmicpc.net
2. 접근 방법
파란색 보드, 초록색 보드를 만들어서 블록을 이동시켜주면 된다.
근데 여기서 파란색 보드는 가로 4, 세로 6 길이를 가지고
초록색 보드의 경우 가로 6, 세로 4이다.
이 부분을고려해서 잘 회전시킨다면
하나의 함수로 블록을 이동시킬 수 있지 않을까 라는 생각을 했다.
이 문제에서 x, y의 표현이 내가 평소에 쓰는 것과 반대여서 ㅠ 슬펐다.
여튼 그렇게 해서 잘 이동시켜주면 되는데,
한 번 문제가 발생했다.
줄을 없애주는 과정에서 문제가 생겼는데,
처음에는 줄을 없애고 바로 패딩 값을 넣어줫따.
근데 그렇게 하면 인덱스가 꼬여버려서 ㅠ (사실 처리해주면 되긴하지만 ,,)
그냥 줄 없앨 때 없애는 줄의 인덱스를 저장하면서 줄을 바로 없애고
다 없앤 후에 패딩 값을 넣어줬다.
3. 코드
python
def solve(block_type, c, board):
global scores
r = 0
# 블록 내리기
while True:
if block_type == 2:
if r == 5 or board[r + 1][c] or board[r + 1][c + 1]:
break
else:
r += 1
else:
if r == 5 or board[r + 1][c]:
break
else:
r += 1
board[r][c] = 1
if block_type == 2:
board[r][c + 1] = 1
elif block_type == 3:
board[r - 1][c] = 1
# 줄 없애기
full_row = []
for i in range(5, -1, -1):
if sum(board[i]) == 4:
full_row.append(i)
scores += 1
pop_row_num = len(full_row)
for idx in full_row:
board.pop(idx)
for _ in range(pop_row_num):
board.insert(0, [0]*4)
# 0, 1행 확인
while True:
if sum(board[1]) != 0:
board.pop()
board.insert(0, [0]*4)
else:
break
N = int(input())
blocks = [list(map(int, input().split())) for _ in range(N)]
scores = 0
green_board = [[0 for _ in range(4)] for _ in range(6)]
blue_board = [[0 for _ in range(4)] for _ in range(6)]
for block_type, x, y in blocks:
solve(block_type, y, green_board)
if block_type == 1:
solve(block_type, 3 - x, blue_board)
elif block_type == 2:
solve(3, 3 - x, blue_board)
elif block_type == 3:
solve(2, 3 - x - 1, blue_board)
total_block = 0
for i in range(6):
total_block += sum(green_board[i])
total_block += sum(blue_board[i])
print(scores, total_block, sep="\n")
4. 마치며
마치며~!
'Algorithm > Python' 카테고리의 다른 글
[백준 1874] 스택 수열 (0) | 2021.04.22 |
---|---|
[백준 2156] 포도주 시식 (0) | 2021.04.22 |
[백준 17837] 새로운 게임2 (0) | 2021.04.21 |
[백준 17142] 연구소3 (0) | 2021.04.20 |
[백준 17140] 이차원 배열과 연산 (0) | 2021.04.20 |