Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Selection Sorting
- 윤성우 열혈자료구조
- 윤성우의 열혈 자료구조
- Graph
- s
- 메모리구조
- JSON
- Serialization
- insertion sort
- Algorithm
- Stack
- datastructure
- 이스케이프 문자
- coding test
- C programming
- list 컬렉션
- 혼자 공부하는 C언어
- 알기쉬운 알고리즘
- buffer
- C 언어 코딩 도장
- R
- 이것이 자바다
- stream
Archives
- Today
- Total
Engineering Note
[BOJ:4485] 녹색 옷 입은 애가 젤다지? 본문
it 취업을 위한 알고리즘 문제 풀이
문제
https://www.acmicpc.net/problem/4485
코드
import sys
from collections import deque
sys.stdin = open("input.txt","rt")
INF = 9999999
dirX = [0,0,-1,1]
dirY = [-1,1,0,0]
def BFS(y,x,graph,cost):
q = deque()
q.append((y,x))
while q:
curY, curX = q.popleft()
for i in range(4):
ny = curY + dirY[i]
nx = curX + dirX[i]
if ny < 0 or nx < 0 or ny >= n or nx >= n:
continue
if cost[ny][nx] > cost[curY][curX] + graph[ny][nx]:
cost[ny][nx] = cost[curY][curX] + graph[ny][nx]
q.append((ny,nx))
count = 1
while True:
n = int(input())
if n == 0:
break
graph = []
cost = [[INF]*n for _ in range(n)]
for _ in range(n):
graph.append(list(map(int,input().split())))
cost[0][0] = graph[0][0]
BFS(0,0,graph,cost)
print(f"Problem {count}: {cost[n-1][n-1]}")
count += 1
문제해결방법
- BFS로 문제를 해결했다.
- 시작 위치 (0,0)을 큐에 넣어주고 큐에서 인접한 곳을 탐색하면서 최소비용 비교를 하고 최소비용이라면 갱신해준다.
- 여기서 인접한 곳은 상,하,좌,우를 통해 이동가능하면서 문제의 주어진 map을 벗어 나지 않는 곳이다.
- 최소비용을 갱신하는 방법은 새로운 위치의 비용과 현재까지 누적된 비용을 합했을 때 지금까지 구한 새로운 위치까지 가는 누적 비용이 작다면 갱신해 주면 된다.
- 이동지도를 나타내는 graph 2차원 배열과 특정 좌표까지 이동하는데 걸리는 비용을 기록할 cost 2차원 배열을 선언해준다. 그리고 시작위치의 비용은 이동지도에 나타난 도둑루피 금액을 초기값으로 저장한다. 그리고 나머지 모든 지점은 무한대 값으로 저장한 후 탐색을 하면서 갱신한다.
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ:10951] A+B - 4 (0) | 2021.07.23 |
---|---|
[BOJ:10828] 스택 (0) | 2021.07.21 |
[BOJ:2753] 윤년 (0) | 2021.05.27 |
[BOJ:16236] 아기상어 (0) | 2021.05.24 |
[BOJ:16234] 인구 이동 (0) | 2021.05.22 |
Comments