https://www.acmicpc.net/problem/20061
n = int(input())
blue = [[0] * 6 for _ in range(4)]
green = [[0] * 4 for _ in range(6)]
def place(t, y, x, k):
if t == 1:
col = 0
while(col <= 5):
if blue[y][col] == 0:
col += 1
else:
break
blue[y][col-1] = k
row = 0
while(row <= 5):
if green[row][x] == 0:
row += 1
else :
break
green[row-1][x] = k
elif t == 2:
col = 0
while(col < 5):
if blue[y][col] == 0 and blue[y][col+1] == 0:
col += 1
else:
break
blue[y][col-1], blue[y][col] = k, k
row = 0
while(row <= 5):
if green[row][x] == 0 and green[row][x+1] == 0:
row += 1
else:
break
green[row-1][x], green[row-1][x+1] = k, k
elif t == 3:
col = 0
while(col <= 5):
if blue[y][col] == 0 and blue[y+1][col] == 0:
col += 1
else :
break
blue[y][col-1], blue[y+1][col-1] = k, k
row = 0
while(row < 5):
if green[row][x] == 0 and green[row+1][x] == 0:
row += 1
else:
break
green[row-1][x], green[row][x] = k, k
def print_blue():
for y in range(4):
for x in range(6):
print(blue[y][x], end=' ')
print()
print()
def print_green():
for y in range(6):
for x in range(4):
print(green[y][x], end=' ')
print()
print()
def get_score():
global score
global green
global blue
i = 5
while(i > 0):
flag = True
for j in range(4):
if green[i][j] == 0 :
flag = False
i -= 1
break
if flag:
score += 1
## 삭제된 행 윗부분 이동
for r in range(i,0,-1):
for c in range(4):
green[r][c] = green[r-1][c]
## 맨 윗행 0으로 초기화
for k in range(4):
green[0][k] = 0
i = 5
while(i > 0):
flag = True
for j in range(4):
if blue[j][i] == 0:
i -= 1
flag = False
break
if flag:
score += 1
## 삭제된 열 왼쪽부분 오른쪽으로 이동
for r in range(4):
for c in range(i,0,-1):
blue[r][c] = blue[r][c-1]
## 맨 왼쪽행 0으로 초기화
for k in range(4):
blue[k][0] = 0
def check_special():
green_cnt = 0
blue_cnt = 0
global blue
global green
for i in range(2):
for j in range(4):
if green[i][j] > 0:
green_cnt += 1
break
for i in range(2):
for j in range(4):
if blue[j][i] > 0:
blue_cnt += 1
break
## 파란색 오른쪽으로 이동
temp_blue = [[0] * 6 for _ in range(4)]
for i in range(4):
for j in range(6-blue_cnt):
temp_blue[i][j+blue_cnt] = blue[i][j]
blue = [temp_blue[i][:] for i in range(4)]
## 초록색 아래로 이동
temp_green = [[0] * 4 for _ in range(6)]
for i in range(6-green_cnt):
for j in range(4):
temp_green[i+green_cnt][j] = green[i][j]
green = [temp_green[i][:] for i in range(6)]
score = 0
for k in range(1,n+1):
t, y, x = map(int,input().split())
place(t, y, x, k)
get_score()
check_special()
print(score)
block_cnt = 0
for i in range(4):
for j in range(6):
if blue[i][j] > 0:
block_cnt += 1
for i in range(6):
for j in range(4):
if green[i][j] > 0:
block_cnt += 1
print(block_cnt)
점수를 얻는부분에서 조건을 만족하면 칸을 비우는 방식으로 for문으로 돌리게끔 짰는데
한턴에 두줄이 동시에 사라지는 상황일경우 맵이 변화한 상태로 다음턴에 들어가므로 index가 꼬이는상황이 나오기에 while로 바꾸고 쭉 체크하게끔 바꾸었다.
블록의 모양따라서 처음으로 해당 블록이 들어갈수 없는 상황일때 해당 인덱스를 기억하고 그 바로 앞 인덱스에 맞춰넣는방식을 선택했다.
그냥 x,y만 바꾸면 블루 그린 같은 매커니즘 이므로 하나로 통합해서 짤까 하다가
실전이었으면 불안해서 그냥 직관적으로 주어진대로 짰을거같아서 그렇게 해봤다
그래서 코드양이 꽤나 길어졌다