즐거운 PS 👩‍💻🥰

[백준-파이썬] 17265: 나의 인생은 수학과 함께

dalin❤️ 2021. 10. 19. 19:52

[문제 보러 가기!](https://www.acmicpc.net/problem/17265

DFS로 풀었다.
DFS에서 좌표, 그때까지 계산한 값, 연산자(그 직전이 연산자인 경우만)를 들고 다닌다.
학교에 도착하면(i==N-1 and j==N-1), 가능하다면 정답을 업데이트해준다.
아래, 오른쪽으로만 가라고 했으니까 그렇게 진행한다.
숫자일 때는 그 전의 연산자를 활용해서 계산해줬고,
연산자일 때는 숫자는 그대로 두고 그 연산자를 가지고 다음으로 넘겨주었다.

한 번 틀렸습니다.를 만났는데, 그 이유는 max_answer을 -1로 세팅하고 시작했기 때문이었다..
처음에 0을 만나고 계속 -, 5, -, 5, -, 5, ... 이런 식으로 진행될 수도 있으니까 -1로 세팅하면 안되는 것이었다.
최대값을 구하라고 하면 보통 -1이나 0으로 세팅했는데 문제를 잘 읽어야 겠다.

import sys

input = sys.stdin.readline

# 아래, 오른쪽만(최단 경로로)
dy, dx = (1, 0), (0, 1)


def dfs(i: int, j: int, curr_num: str, before: str):  # 좌표, 그때까지 계산한 값
    global max_answer, min_answer

    if i == N - 1 and j == N - 1:  # 학교 도착했으면
        # 정답 업데이트
        max_answer = max(max_answer, int(curr_num))
        min_answer = min(min_answer, int(curr_num))

    # 아래, 오른쪽만
    for k in range(2):
        ni = i + dy[k]
        nj = j + dx[k]

        # 범위
        if ni < 0 or nj < 0 or ni >= N or nj >= N:
            continue

        if map_arr[ni][nj].isdigit():  # 숫자라면
            dfs(ni, nj, str(eval(curr_num + before + map_arr[ni][nj])), '')
        else:  # 기호라면
            dfs(ni, nj, curr_num, map_arr[ni][nj])


N = int(input())
map_arr = list(input().split() for _ in range(N))

max_answer = -(5 ** 20)
min_answer = 5 ** 20

dfs(0, 0, map_arr[0][0], '')
print(max_answer, min_answer)
728x90