본문 바로가기

카테고리 없음

[백준 19237번] 어른 상어 (Python3)

import sys
input = sys.stdin.readline
dy = [-1,1,0,0]
dx = [0,0,-1,1]

def smellup():
  global finish
  cnt = 0
  for i in range(N):
    for j in range(N):
      if ocean[i][j]:
        smell[i][j] = [k,ocean[i][j]]
        cnt += 1
  if cnt == 1:
    finish = True

def smelldown():
  for i in range(N):
    for j in range(N):
      if smell[i][j][0]:
        smell[i][j][0] -= 1

def moveshark():
  newocean = [[0]*N for i in range(N)]
  for y in range(N):
    for x in range(N):
      if ocean[y][x]:
        n = ocean[y][x]
        moved = False
        for d in priority[n][direction[n]]:
          y1,x1 = y+dy[d],x+dx[d]
          if not (N>y1>=0 and N>x1>=0) or smell[y1][x1][0]:
            continue
          moved = True
          direction[n] = d
          break
        if not moved:
          for d in priority[n][direction[n]]:
            y1,x1 = y+dy[d],x+dx[d]
            if not (N>y1>=0 and N>x1>=0) or smell[y1][x1][1] != n:
              continue
            direction[n] = d
            break
        if newocean[y1][x1] and n > newocean[y1][x1]:
          continue
        newocean[y1][x1] = n
  return newocean

N,M,k = map(int,input().split())
ocean = []
for i in range(N):
  ocean.append([*map(int,input().split())])

direction = [0]
direction.extend(map(lambda x:x-1,map(int,input().split())))
priority = [[] for i in range(M+1)]
for n in range(1,M+1):
  for i in range(4):
    priority[n].append([*map(lambda x:x-1,map(int,input().split()))])

smell = [[[0,0] for i in range(N)] for i in range(N)]
finish = False
for result in range(1001):
  smellup()
  if finish:
    break
  ocean = moveshark()
  smelldown()

if finish:
  print(result)
else:
  print(-1)

 

오늘도 재미있는(?) 구현문제

 

상어시리즈를 포함한 구현문제가 늘 그렇듯 코드 난이도는 쉽고, 시간은 오래걸린다.

긴 구현문제를 풀면 항상 오타가 나오는걸 고쳐야할 것 같다.

 

오늘의 교훈) 오타 주의!