문제
- SWEA 모의 SW 역량 테스트 1949. 등산로조성
- python
- 문제링크
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
나의 코드
현재 봉우리의 높이보다 작은 높이의 봉우리를 찾아서 DFS로 탐색하되, 동시에 현재 봉우리의 높이와 같거나 더 높은 봉우리를 깎으면서 탐색을 진행한다. 주어진 K 안에서 가능한 모든 높이로 탐색하는 것과, 한 번 봉우리를 깎으면 다른 봉우리들은 깎지 않는 것이 관건이다.
def check(r, c):
return 0 <= r < N and 0 <= c < N
def dfs(r, c):
global k, maxvisit, cut
dr, dc = [-1, 1, 0, 0], [0, 0, -1, 1]
for dir in range(4):
nr = r + dr[dir]
nc = c + dc[dir]
if check(nr, nc):
# 다음 등산로의 높이가 현재 등산로보다 높이가 낮고 탐색 가능하다면
if mapp[nr][nc] < mapp[r][c] and visited[nr][nc] == 0:
visited[nr][nc] = visited[r][c] + 1
dfs(nr, nc)
if visited[nr][nc] > maxvisit:
maxvisit = visited[nr][nc]
visited[nr][nc] = 0
# 다음 등산로의 높이가 현재 등산로보다 높이가 같거나 높다면
if mapp[nr][nc] >= mapp[r][c] and visited[nr][nc] == 0 and not cut:
# 가능한 k 값 내에서 계속 깎아본다
for i in range(1, K + 1):
height = mapp[nr][nc] - i
# 깎은 높이가 현재 위치보다 낮아진다면, 아직 깎은 적이 없다면
if height < mapp[r][c]:
# 공사하기
mapp[nr][nc] = height
cut = True
visited[nr][nc] = visited[r][c] + 1
# dfs 다시 진행
dfs(nr, nc)
# 방문한 거리가 가장 멀다면 maxvisit에 저장
if visited[nr][nc] > maxvisit:
maxvisit = visited[nr][nc]
cut = False
# 깎은거 다시 원래대로 되돌려놓기
mapp[nr][nc] += i
visited[nr][nc] = 0
T = int(input())
for tc in range(T):
N, K = map(int, input().split())
mapp = [list(map(int, input().split())) for _ in range(N)]
maxval = 0
# 가장 높은 봉우리 탐색
for i in range(N):
for j in range(N):
if mapp[i][j] > maxval:
maxval = mapp[i][j]
# 가장 높은 봉우리들 저장
tallidx = []
for k in range(N):
for l in range(N):
if mapp[k][l] == maxval:
tallidx.append((k, l))
# 이동한 거리 저장
visited = [[0] * N for _ in range(N)]
# 가장 먼 거리 저장
maxvisit = 0
# 깎았는지 저장
cut = False
# 높은 봉우리들에 대해 dfs 진행
for d in tallidx:
r, c = d
visited[r][c] = 1
dfs(r, c)
visited = [[0] * N for _ in range(N)]
print("#{} {}".format(tc+1, maxvisit))
테스트 케이스 하나하나를 돌려보면서 디버깅을 엄청 많이 한 문제다.. 역시나 예외처리 어렵다 ㅠㅠ
'개발공부 > algorithm' 카테고리의 다른 글
[백준][python] 11057.오르막수 - DP (0) | 2021.03.27 |
---|---|
[백준][python] 11047.동전0 - Greedy (0) | 2021.03.09 |
[백준][python] 2193.이친수 - 동적계획법 (0) | 2021.03.08 |
[백준][python] 1904.01타일 - 동적계획법 (0) | 2021.03.07 |
[백준][python] 1003.피보나치 함수 - 동적계획법 (0) | 2021.03.07 |