본문 바로가기

알고리즘/백준

[백준] 19237번 : 어른 상어

728x90

19237번: 어른 상어

 

19237번: 어른 상어

첫 줄에는 N, M, k가 주어진다. (2 ≤ N ≤ 20, 2 ≤ M ≤ N2, 1 ≤ k ≤ 1,000) 그 다음 줄부터 N개의 줄에 걸쳐 격자의 모습이 주어진다. 0은 빈칸이고, 0이 아닌 수 x는 x번 상어가 들어있는 칸을 의미

www.acmicpc.net

🤔 문제분석

함수를 3가지로로 나누어서 문제를 해결하였습니다.

  • 상어가 움직인다 : 상어가 움직이는것은 첫번째로 우선순위에 따라서 빈칸을 체크하고, 그 다음순으로 자기자신의 냄새를 찾는다. ( 여기서 중요한점은 항상 빈칸이거나 자기자신의 냄새를 찾을 수 있다.)
  • 냄새를 풍긴다 : 움직이는 우선순이때문에 다른 상어와 겹칠 일은 없다.
  • 냄새가 사라진다 : 냄새가 사라지면서 만약 냄새가 0이되면 상어 표시도 지워준다.

💻 코드

import sys
input = sys.stdin.readline

N, M, k = map(int, input().split())

table = []
shark = []
smell = [[[-1, 0] for _ in range(N)] for _ in range(N)]
shark_priority = [[] for _ in range(M)]

for i in range(N):
    temp = list(map(int ,input().split()))
    for j in range(N):
        if temp[j] != 0:
            shark.append([temp[j]-1, i, j])
            
shark.sort(key=lambda x:x[0])
            
shark_dir = list(d-1 for d in list(map(int, input().split())))

for i in range(M):
    for _ in range(4):
        shark_priority[i].append(list(d-1 for d in list(map(int, input().split()))))

def find_dir(y, x, dir, shark_idx):
    moves = [(-1, 0), (1, 0), (0, -1), (0, 1)]
    priority = shark_priority[shark_idx][dir]
    
    # 빈칸이 있는경우를 찾는다.
    for d in priority:
        dy, dx = moves[d][0], moves[d][1]
        ny, nx = dy + y, dx + x
        if N > ny >=0 and N > nx >= 0 and smell[ny][nx][0] == -1:
            return ny, nx, d
    
    # 빈칸이 없다면 우선순위에 따라서 찾는다.
    for d in priority:
        dy, dx = moves[d][0], moves[d][1]
        ny, nx = dy + y, dx + x
        if N > ny >=0 and N > nx >=0 and smell[ny][nx][0] == shark_idx:
            return ny, nx, d
    
    
def smell_remove():
    for i in range(N):
        for j in range(N):
            if smell[i][j][1] >= 1:
                smell[i][j][1] -= 1
            
            if smell[i][j][1] == 0:
                smell[i][j][0] = -1
                
def make_smell(shark):
    for i, y, x in shark:
        smell[y][x][0] = i
        smell[y][x][1] = k
        
time = 0
while True:
    if time > 1000:
        break
    
    if len(shark) == 1:
        break
    time += 1
    
    target_shark = []
    
    for i, y, x in shark:
        dir = shark_dir[i]
        ny, nx, n_dir = find_dir(y, x, dir, i)
        target_shark.append((i, ny, nx))
        shark_dir[i] = n_dir
        
    new_shark = []
    target_shark.sort(key=lambda x:x[0])
    visited = set()
    for idx, y, x in target_shark:
        if (y, x) not in visited:
            visited.add((y, x))
            new_shark.append((idx, y, x))
    
    
    make_smell(shark)
    smell_remove()
    shark = new_shark

if time > 1000:
    print(-1)
else:
    print(time)
    

🎯 피드백 및 개선사항

문제를 푸는데에 시간이 조금 걸렸지만 혼자서 문제를 해결하였습니다. 마음 급하지 말고 천천히 풀어보자!! 😀

728x90