본문 바로가기

CodingTest/Baekjun Online Judge

[ BOJ / 파이썬 ] 11559. Puyo Puyo

40분 걸려서 풀었는데.. 18%인가에서 '틀렸습니다.' .. 😥😥

확실히 시뮬레이션 유형, 그니까 코드 구현력이 약하다..

많이 풀면서 속도와 정확도 올리는 것에 관심 가져야겠다.

 

1차 제출. 실패 코드. 풀이시간 40분

import sys
input = sys.stdin.readline
from collections import deque

dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
def bfs(a, b, field):
  visited = [[False]*6 for _ in range(12)]
  q = deque([(a, b)])
  visited[a][b] = True
  puyos = []
  while q:
    x, y = q.popleft()
    puyos.append((x, y))
    for i in range(4):
      nx = x + dx[i]
      ny = y + dy[i]
      if 0 <= nx < 12 and 0 <= ny < 6 and field[a][b] == field[nx][ny] and not visited[nx][ny]:
        visited[nx][ny] = True
        q.append((nx, ny))
        
  if len(puyos) >= 4:
    return puyos
  else:
    return None

def pop(puyos, field):
  for puyo in puyos:
    x, y = puyo
    field[x][y] = '.'
  for j in range(6):
    for i in range(11, -1, -1):
      if field[i][j] == '.':
        ni = i - 1
        while 0 <= ni:
          if field[ni][j] != '.':
            field[i][j] = field[ni][j]
            field[ni][j] = '.'
            break
          ni -= 1
  return field

def play(field):
  global puyo_count
  visited = [[False] * 6 for _ in range(12)]
  for i in range(11, -1, -1):
    for j in range(6):
      if field[i][j] != '.' and not visited[i][j]:
        puyos = bfs(i, j, field)
        if puyos:
          field = pop(puyos, field)
          puyo_count += 1
          
      
field = [list(input().strip()) for _ in range(12)]
relay = 0
puyo_count = 0
play(field)
print(puyo_count)

 

 

어후.. 문제를 이해 못 해서 틀린거였다..

다시 고민하다가 이해하고 수정하는데 또 30분 소요.. 후!하!

 

그니까 뿌요그룹이 여러개가 터져도 시간당 counting이 되기 때문에 한 묶음으로 처리되는걸 이해 못했다.

import sys
input = sys.stdin.readline
from collections import deque

dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
def bfs(a, b, field):
  visited = [[False]*6 for _ in range(12)]
  q = deque([(a, b)])
  visited[a][b] = True
  puyos = []
  while q:
    x, y = q.popleft()
    puyos.append((x, y))
    for i in range(4):
      nx = x + dx[i]
      ny = y + dy[i]
      if 0 <= nx < 12 and 0 <= ny < 6 and field[a][b] == field[nx][ny] and not visited[nx][ny]:
        visited[nx][ny] = True
        q.append((nx, ny))
        
  if len(puyos) >= 4:
    return puyos
  else:
    return None

def pop(puyosList, field):
  for puyos in puyosList:
    for puyo in puyos:
      x, y = puyo
      field[x][y] = '.'
  for j in range(6):
    for i in range(11, -1, -1):
      if field[i][j] == '.':
        ni = i - 1
        while 0 <= ni:
          if field[ni][j] != '.':
            field[i][j] = field[ni][j]
            field[ni][j] = '.'
            break
          ni -= 1
  return field

def play(field):
  popPuyos = []
  for i in range(11, -1, -1):
    for j in range(6):
      if field[i][j] != '.':
        puyos = bfs(i, j, field)
        if puyos:
          popPuyos.append(puyos)
  if popPuyos:
    field = pop(popPuyos, field)
    return [True, field]
  else:
    return[False, field]
          
          
      
field = [list(input().strip()) for _ in range(12)]
puyo_count = 0
isPop, field = play(field)
while isPop:
  puyo_count += 1
  isPop, field = play(field)
print(puyo_count)

 

 

그래도 혼자 힘으로 골드4 풀어낸다는 것에 작은 만족감을 느꼈다.

 

많이 성장했다 진짜..

 

대신 속도와 정확성 계속 연습하기 !!