티스토리 뷰
https://www.acmicpc.net/problem/22116
22116번: 창영이와 퇴근
A1,1에서 AN,N까지, 경로상의 최대 경사의 최솟값을 출력한다.
www.acmicpc.net
문제
창영이의 퇴근길은 출근길과 조금 다르다. 창영이는 건강을 위해 따릉이를 빌려 타고 퇴근하는 습관을 기르고 있다.
창영이의 퇴근길은 N×N 크기의 격자로 표현된다. 창영이는 A1,1에서 출발하여 AN,N까지 이동할 계획이다. 창영이는 상하좌우 인접한 격자로 한 번에 한 칸씩 이동할 수 있다. 각 격자 Ar,c에는 자연수가 적혀 있는데, 이는 해당 지역의 높이를 뜻한다. 인접한 격자 사이의 높이 차이의 절댓값을 경사라고 하고, 경사가 클수록 경사가 가파르다고 하자.
따릉이는 가격에 따라 성능이 다르다. 비싼 따릉이는 경사가 가파르더라도 내리지 않고 타고 갈 수 있지만, 값싼 따릉이는 경사가 가파르면 힘들고 위험하기 때문에 내려서 이동해야 한다.
창영이는 최소한의 비용으로 따릉이를 빌려서, 따릉이에서 한 번도 내리지 않고 집에 도착하고 싶다. 그러기 위해선 창영이가 지날 수 있는 최대 경사의 최솟값을 알아야만 한다. 여러분들이 창영이를 도와주자.
유형 : 다익스트라
접근 방식
- 경사의 값을 최소로 유지한 채 탐색을 완료해야 하는 문제이다.
- 이전까지의 경로에 있어 가장 적은 경사 값으로만 탐색하고 있는 노드를 우선 탐색해야 한다.
- 우선순위 큐를 이용한 다익스트라 !
- 방문 배열에 MAX값을 저장하고 탐색을 진행하자
- 해당 값보다 적은 경사를 유지한채 도착했다면 갱신해주도록 하자
전체 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static int n = 0;
static int m = 0;
static int[][] board;
static int[] dx = {1,-1,0,0};
static int[] dy = {0,0,-1,1};
public static void main(String[] args) throws Exception {
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
board = new int[n+1][n+1];
for(int i=1;i<=n;i++){
st = new StringTokenizer(br.readLine());
for(int j=1;j<=n;j++){
board[i][j] = Integer.parseInt(st.nextToken());
}
}
search();
br.close();
}
static void search(){
int MAX = Integer.MAX_VALUE;
int[][] v = new int[n+1][n+1];
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
v[i][j] = MAX;
}
}
PriorityQueue<Node> pq = new PriorityQueue<>(
(x,y) -> x.num - y.num
);
v[1][1] = 0;
pq.add(new Node(1,1,0));
while(!pq.isEmpty()){
Node cur = pq.poll();
if(cur.x == n && cur.y == n){
break;
}
for(int i=0;i<4;i++){
int nx = cur.x + dx[i];
int ny = cur.y + dy[i];
if(nx < 1 || nx > n || ny < 1 || ny > n)
continue;
int tmp = Math.abs(board[nx][ny] - board[cur.x][cur.y]);
if(v[nx][ny] > Math.max(v[cur.x][cur.y],tmp)){
v[nx][ny] = Math.max(v[cur.x][cur.y],tmp);
pq.add(new Node(nx,ny,v[nx][ny]));
}
}
}
System.out.println(v[n][n]);
}
}
class Node{
int x;
int y;
int num;
Node(int x,int y,int num){
this.x = x;
this.y = y;
this.num = num;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 18223 (민준이와 마산 그리고 건우) - java (1) | 2023.11.21 |
---|---|
백준 11952 (좀비) - java (1) | 2023.11.20 |
백준 2565 (전깃줄) - java (1) | 2023.11.20 |
백준 1987 (알파벳) - java (0) | 2023.11.17 |
백준 2170 (선 긋기) - java (0) | 2023.11.16 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백준 #1759 #암호 만들기
- Java
- 백준 #25195 #yes or yes #java #자바
- 백준 #18405 #경쟁적 전염
- 백준 #3980 #선발 명단
- 백준 #1727 #커플 만들기 #자바 #java
- 백준 #17940 #주식 #자바 #java
- 백준 #28140 #빨강~ 빨강~ 파랑! 파랑! 달콤한 솜사탕! #java #자바
- 백준 #4963 #섬의 개수
- 백준 #1325 #효율적인 해킹
- 백준
- 백준 #
- 백준 #12014 #주식 #자바 #java
- 백준 #13549 #숨바꼭질3
- 17394
- 백준 #2636 #치즈
- 백준 #치즈 #2638
- 백준 #1987 #알파벳 #자바 #java
- 백준 #15686 #치킨 배달
- 자바 #JAVA
- 백준 #25603 #짱해커 이동식 #java #자바
- 백준 #인구 이동 #16234
- 백준 #16973 #직사각형 탈출
- 17218
- 백준 #5721 #사탕 줍기 대회 #java #자바
- 자바
- 백준 #다리 만들기 #2146
- 백준 #14863 #서울에서 경산까지 #java #자바
- 백준 #2580 #스도쿠
- 백준 #1584 #게임 #java #자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함