[문제 보러 가기!](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
'즐거운 PS 👩💻🥰' 카테고리의 다른 글
[백준-파이썬] 20159: 동작 그만. 밑장 빼기냐. (0) | 2021.10.23 |
---|---|
[백준-파이썬] 21776: 가희와 읽기 쓰기 놀이 (0) | 2021.10.20 |
[백준-파이썬] 2602: 돌다리 건너기 (0) | 2021.10.16 |
[백준-파이썬] 14621: 나만 안되는 연애 (0) | 2021.10.15 |
[SWEA-파이썬] 1795: 인수의 생일 파티 (0) | 2021.10.15 |