백준 19237 어른 상어

gmlwlswldbs·2021년 10월 20일
0

코딩테스트

목록 보기
58/130
n, m, k = map(int, input().split())
shark = [(-1, -1)] * (m + 1)
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
g = [list(map(int, input().split())) for _ in range(n)]
smell = [[[0, 0]] * n for _ in range(n)]
now_dir = [0] + list(map(int, input().split()))

# 격자의 상어 shark 에 저장
for i in range(n):
    for j in range(n):
        if g[i][j] != 0:
            shark[g[i][j]] = (i, j)

# 방향 우선 순위 입력
case = [[[0]* 4 for _ in range(4)] for _ in range(m)]
for i in range(m):
    for j in range(4):
        case[i][j] = list(map(int, input().split()))

# 초기 상어 위치에 냄새
for i in range(1, len(shark)):
    x, y = shark[i]
    smell[x][y] = [i, k]

# 냄새 감소와 g에 상어 있으면 냄새 추가
def smelloperation(g, smell):
    for u in range(n):
        for v in range(n):
            # 냄새 남은 시간이 0 보다 크면 1개 감소시킴
            if smell[u][v][1] > 0:
                smell[u][v][1] -= 1
            # 만약 상어가 그 자리에 왔으면 냄새 추가
            if g[u][v] != 0:
                smell[u][v] = [g[u][v], k]    
    return

def move(shark, g, now_dir, smell):
    # 먼저 방향 설정해줌 now_dir 바꿔준다
    for i in range(1, m+1):
        # 이미 격자에서 나간 상어
        if shark[i] == (-1, -1):
            continue
        findnosmell = False
        x, y = shark[i]
        # 우선순위에 따라 방향 설정
        for d in range(4):
            nx, ny = x + dx[case[i-1][now_dir[i] - 1][d] - 1], y + dy[case[i-1][now_dir[i] - 1][d] - 1]
            if nx < 0 or ny < 0 or nx >= n or ny >= n:
                continue
            # 냄새가 없는 곳 찾음. 방향 정했음
            if smell[nx][ny][1] == 0:
                now_dir[i] = case[i-1][now_dir[i] - 1][d]
                findnosmell = True
                break
        # 냄새 없는 곳 못 찾아서 내 냄새 있는 곳을 찾아감
        if findnosmell == False:
            for d in range(4):
                nx, ny = x + dx[case[i-1][now_dir[i] - 1][d] - 1], y + dy[case[i-1][now_dir[i] - 1][d] - 1]
                if nx < 0 or ny < 0 or nx >= n or ny >= n:
                    continue
                if smell[nx][ny][0] == i:
                    now_dir[i] = case[i-1][now_dir[i] - 1][d]
                    break

    # 정해진 방향대로 상어 이동
    for i in range(1, m+1):
        # 이미 격자를 나간 상어는 무시
        if shark[i] == (-1, -1):
            continue
        # 방향대로 상어 이동
        x, y = shark[i]
        d = now_dir[i]
        shark[i] = (x + dx[d - 1], y + dy[d - 1]) 

    # 중복 상어 처리
    for i in range(1, m+1):
        for j in range(i+1, m+1):
            # 상어 위치가 겹치면 뒤에 상어(번호가 큰 상어)는 내보냄
            if shark[i] == shark[j]:
                shark[j] = (-1, -1)

    # 최종 상어 위치를 g에 넣어줌
    g = [[0] * n for _ in range(n)]
    for i in range(1, m+1):
        if shark[i] == (-1, -1):
            continue
        x, y = shark[i]
        g[x][y] = i
    return shark, g, now_dir, smell

t = 0
while True:
    smelloperation(g, smell)
    shark, g, now_dir, smell = move(shark, g, now_dir, smell) 
    t += 1
    loopout = True
    for i in range(2, m+1):
        if shark[i] != (-1, -1):
            loopout = False
            break
        
    if t > 1000:
        t = -1
        loopout = True

    if loopout:
        print(t)
        break

인덱스 문제로 헷갈려서 오래걸림...
마지막 루프 빠져 나올 때 t >= 1000 으로 했다가 틀려서 힘들었음...
1000번째까지 냄새퍼지고, 이동 가능하고 10001번째는 모든 이동을 끝내도 결과를 낼 수 없음

0개의 댓글