[백준 삼성기출 X] 청소년 상어(python)

이진규·2022년 10월 5일
1

백준(PYTHON)

목록 보기
100/115

문제

https://www.acmicpc.net/problem/19236

나의 코드

"""

"""

import copy

pan = [ [] for _ in range(4) ]
answer = 0

for i in range(4):
    tmp = list(map(int, input().split()))
    fish = []
    for j in range(0, 8, 2):
        fish.append([tmp[j], tmp[j+1]-1]) # 방향은 -1 해서 입력
    pan[i] = fish

dx = [-1, -1, 0, 1, 1, 1, 0, -1]
dy = [0, -1, -1, -1, 0, 1, 1, 1]
answer = 0

def dfs(sx, sy, score, pan):
    global answer
    score += pan[sx][sy][0] # 상어가 먹은 물고기의 번호
    answer = max(answer, score)
    pan[sx][sy][0] = 0 # 물고기가 잡아 먹힌곳은 0으로 표시

    # 물고기의 이동
    for f in range(1, 16+1):
        f_x, f_y = -1, -1
        for x in range(4):
            for y in range(4):
                if pan[x][y][0] == f: # 믈고기를 찾으면 좌표 저장 후 바로 탈출
                    f_x, f_y = x, y
                    break

        if f_x == -1 and f_y == -1: # 물고기가 잡아 먹힌 경우는 다음 물고기로 넘어감
            continue

        f_d = pan[f_x][f_y][1]

        for i in range(8): # 물고기 방향 돌리기
            md = (f_d + i) % 8
            mx = f_x + dx[md]
            my = f_y + dy[md]

            if not (0 <= mx < 4 and 0 <= my < 4) or (mx == sx and my == sy): # 범위를 벗어나거나 상어를 만나면 stop
                continue

            pan[mx][my], pan[f_x][f_y] = pan[f_x][f_y], pan[mx][my] # 45도 반시계 방향으로 돌리고 이동이 가능하면 좌표를 바꾸고 stop
            pan[mx][my][1] = md  # 방향 업데이트
            break

    # 상어의 이동
    s_d = pan[sx][sy][1]
    for i in range(1, 5):
        mx = sx + dx[s_d] * i # (0, 0)에서 우측을 본다면 (0, 1), (0, 2), (0, 3) 다 갈 수 있도록 설정
        my = sy + dy[s_d] * i

        if (0 <= mx < 4 and 0 <= my < 4) and pan[mx][my][0] > 0:
            dfs(mx, my, score, copy.deepcopy(pan))

dfs(0, 0, 0, pan)
print(answer)

    

설명

DFS + 구현 문제

참고 자료

https://developer-ellen.tistory.com/68

profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글