풀이 시간
- 1h 39m
- 그냥 구현하라는 대로 구현하면 되는 문젠데 약간 뻘짓해서 풀이 시간이 길었다
구현 방식
- 일단 초록색 보드 (green)과 파란색 보드 (blue)를 따로 2차원 리스트로 생성했다
- 아래를 차례대로 구현해주면 된다
1) 초록색 판 이동
2) 초록색 판 점수 획득 + 행 제거
3) 초록색 연한 칸 확인 + 행 제거
4) 파란색 판 이동
5) 파란색 판 점수 획득 + 열 제거
6) 파란색 연한 칸 확인 + 열 제거
- 1), 4)는 각각 move_green, move_blue 함수를 통해 구현함
-> t에 따라서 조건 분기 + while문을 돌며 보드의 끝에 도달하거나 다른 타일을 만났을 경우에 그리고자 하는 타일을 그려주고 break
- removed_green 리스트에는 0으로 초기화될 row의 index가 들어간다
- removed_green 리스트의 길이만큼 for문을 돌며, 역순으로 행을 순회하여 green[i] = green[i-1]을 해주고 green[4]는 0으로 초기화해주는 방식으로 초록색 판의 행 제거를 구현했다
- removed_blue 리스트에는 0으로 초기화될 column의 index가 들어간다
- removed_blue 리스트의 길이만큼 for문을 돌며, 역순으로 열을 순회하여 blue[i][j] = blue[i][j-1]을 해주고 blue[i][4]를 0으로 초기화해주는 방식으로 파란색 판의 열 제거를 구현했다
- 초록색 연한 칸 확인 + 행 제거 및 파란색 연한 칸 확인 + 열 제거도 이와 비슷한 방식으로 구현해주었다
코드
import sys
green = [[0] * 4 for _ in range(10)]
blue = [[0] * 10 for _ in range(4)]
def move_green(t, x, y):
if t == 1:
while True:
if x >= 10:
green[x-1][y] = 1; break
if green[x][y] != 0:
green[x-1][y] = 1; break
x += 1
elif t == 2:
while True:
if x >= 10:
green[x-1][y] = 1; green[x-1][y+1] = 1; break
if green[x][y] != 0 or green[x][y+1] != 0:
green[x-1][y] = 1; green[x-1][y+1] = 1; break
x += 1
elif t == 3:
while True:
if x >= 10:
green[x-1][y] = 1; green[x-2][y] = 1; break
if green[x][y] != 0:
green[x-1][y] = 1; green[x-2][y] = 1; break
x += 1
def move_blue(t, x, y):
if t == 1:
while True:
if y >= 10:
blue[x][y-1] = 1; break
if blue[x][y] != 0:
blue[x][y-1] = 1; break
y += 1
elif t == 2:
while True:
if y >= 10:
blue[x][y-1] = 1; blue[x][y-2] = 1; break
if blue[x][y] != 0:
blue[x][y-1] = 1; blue[x][y-2] = 1; break
y += 1
elif t == 3:
while True:
if y >= 10:
blue[x][y-1] = 1; blue[x+1][y-1] = 1; break
if blue[x][y] != 0 or blue[x+1][y] != 0:
blue[x][y-1] = 1; blue[x+1][y-1] = 1; break
y += 1
N = int(sys.stdin.readline()[:-1])
cmd = []
for n in range(N):
t, x, y = map(int, sys.stdin.readline()[:-1].split())
cmd.append((t, x, y))
total_score = 0
for n in range(N):
t, x, y = cmd[n]
move_green(t, x, y)
removed_green = []
for i in range(10):
if sum(green[i]) == 4:
removed_green.append(i)
total_score += 1
for row in removed_green:
for i in range(row, 4, -1):
green[i] = green[i-1]
green[4] = [0, 0, 0, 0]
row_cnt = 0
for i in range(4, 6):
if sum(green[i]) != 0:
row_cnt += 1
for _ in range(row_cnt):
for i in range(10-1, 4, -1):
green[i] = green[i-1]
green[4] = [0, 0, 0, 0]
move_blue(t, x, y)
removed_blue = []
for j in range(6, 10):
tmp = 0
for i in range(4):
tmp += blue[i][j]
if tmp == 4:
removed_blue.append(j)
total_score += 1
for col in removed_blue:
for j in range(col, 4, -1):
for i in range(4):
blue[i][j] = blue[i][j-1]
for i in range(4):
blue[i][4] = 0
col_cnt = 0
for j in range(4, 6):
for i in range(4):
if blue[i][j] != 0:
col_cnt += 1
break
for _ in range(col_cnt):
for j in range(10-1, 4, -1):
for i in range(4):
blue[i][j] = blue[i][j-1]
for i in range(4):
blue[i][4] = 0
print(total_score)
result = 0
for i in range(6, 10):
result += sum(green[i])
for i in range(4):
for j in range(6, 10):
result += blue[i][j]
print(result)
결과