728x90
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
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 18809번 : Gaaaaaaaaaarden (0) | 2024.03.02 |
---|---|
[백준] 21610번 : 마법사 상어와 비바라기 (0) | 2024.02.29 |
[백준] 17837번 : 새로운게임 (0) | 2024.02.27 |
[백준] 17825번 : 주사위 (1) | 2024.02.26 |
[백준] 4803번 : 트리 (1) | 2024.02.26 |