리뷰
https://www.acmicpc.net/problem/22116
(0, 0)에서 (n - 1, n - 1)좌표로 가능 경로상의 최대 경사의 최소값을 출력하는 문제
전역 변수
- n : 맵의 한 변의 크기를 저장할 변수
- ans : 정답을 저장하기 위한 변수, 초기값은 10억보다 큰 값으로 설정한다.
- lst : 격자 높이 정보를 저장할 2차원 배열
- dx, dy : 4방향 탐색을 위한 방향 배열
- Pos : 시뮬레이션 시 위치 정보와 최대 경사를 정의할 구조체, 경사 값을 기준으로 오름차순 정렬한다.
함수
1. dijkstra
int dijkstra() {
priority_queue<Pos> pq;
pq.push({ 0, 0, 0 });
vector<vector<int>> h(n, vector<int>(n, 2e9));
h[0][0] = 0;
while (!pq.empty()) {
Pos pos = pq.top(); pq.pop();
int cx = pos.x, cy = pos.y, cd = pos.d;
if (cx == n - 1 && cy == n - 1) return cd;
//cout << cx << " " << cy << " " << cd << "\n";
for (int i = 0; i < 4; ++i) {
int nx = cx + dx[i], ny = cy + dy[i];
if (0 <= nx && nx < n && 0 <= ny && ny < n) {
int nd = max(cd, abs(lst[nx][ny] - lst[cx][cy]));
if (h[nx][ny] > nd) {
h[nx][ny] = nd;
pq.push({ nx, ny, nd });
}
}
}
}
return -1;
}
다익스트라를 통해 출발 지점에서 목표 지점까지 경로상의 최대 경사의 최소값을 출력하는 함수
문제풀이
- n값을 입력 받고, n * n크기의 맵 정보를 lst배열에 입력 받아주고, dijkstra함수를 호출해 준다.
- Pos타입의 우선순위 큐 pq를 초기화 하고, 초기값 {0, 0, 0}을 push해준다.
- n * n크기의 2차원 벡터 h의 초기값을 10억보다 큰 값으로 초기화 해준다.
- 출발 지점인 (0, 0)위치의 h배열의 값을 0으로 초기화 해준다.
- pq가 빌 때 까지 while루프를 수행하고, 매 루프마다 요소를 한개씩 꺼내어 각 요소를 변수 cx, cy, cd에 파싱한다.
- 기저 조건으로 만약 도착 위치에 도달했다면 cd에 저장된 값을 리턴해 준다.
- 4방향 탐색을 진행하고, 맵의 범위 안에 있다면 이동을 진행해 준다.
- 변수 nd에 cd와 현재 위치 - 이동 위치의 차이의 절대값을 비교해 더 큰 값으로 저장해 준다.
- 이동할 위치의 h배열의 값이 nd보다 크다면 갱신한 후 이동 위치와 nd를 pq에 push해준다.
- dijkstra가 기저조건에 도달해 종료되었을 경우 해당 함수의 리턴값을 출력해 준다.
트러블 슈팅
없음
참고 사항
- 경로상의 최대 경사를 유지해 주어야 하므로 max연산을 통해 기존 경사와 비교해 주어야 한다.
정답 코드
#include<iostream>
#include<queue>
using namespace std;
int n, ans = 2e9;
int lst[1000][1000];
int dx[] = { 1, -1, 0, 0 };
int dy[] = { 0, 0, 1, -1 };
struct Pos {
int x, y, d;
bool operator<(const Pos& other) const {
return d > other.d;
}
};
int dijkstra() {
priority_queue<Pos> pq;
pq.push({ 0, 0, 0 });
vector<vector<int>> h(n, vector<int>(n, 2e9));
h[0][0] = 0;
while (!pq.empty()) {
Pos pos = pq.top(); pq.pop();
int cx = pos.x, cy = pos.y, cd = pos.d;
if (cx == n - 1 && cy == n - 1) return cd;
//cout << cx << " " << cy << " " << cd << "\n";
for (int i = 0; i < 4; ++i) {
int nx = cx + dx[i], ny = cy + dy[i];
if (0 <= nx && nx < n && 0 <= ny && ny < n) {
int nd = max(cd, abs(lst[nx][ny] - lst[cx][cy]));
if (h[nx][ny] > nd) {
h[nx][ny] = nd;
pq.push({ nx, ny, nd });
}
}
}
}
return -1;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin >> lst[i][j];
}
}
cout << dijkstra();
}
728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
[G4] 백준 2194번 유닛 이동시키기 C++ 너비 우선 탐색 (0) | 2025.04.17 |
---|---|
[G4] 백준 2412번 암벽 등반 C++ 너비 우선 탐색, 해시맵 (0) | 2025.04.15 |
[G2] 백준 1486번 등산 C++ 다익스트라, 정렬 (0) | 2025.04.13 |
[G2] 백준 17835번 면접보는 승범이네 C++ 다익스트라 (0) | 2025.04.12 |
[P4] 백준 17481번 최애 정하기 C++ 이분 매칭, 해시맵 (1) | 2025.04.10 |