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 |
Tags
- 다익스트라
- 행렬
- matrix
- 대상파일
- 스레드전용리소스
- 컴파일러
- 구문트리
- column space
- 컴퓨터밑바닥의비밀
- 다이나믹 프로그래밍
- rust 스터디
- unity
- 코드포스
- CS정리
- vector
- 벡터
- c++
- 동적링크
- 선형대수학
- 적재도구loader
- 백준
- 심벌 해석
- 알고리즘
- Rust
- 스레드전용저장소
- linear algebra
- 정적링크
- 재배치
- eigenvalue
- 링커
Archives
- Today
- Total
개발_기록용
[백준 13549] C++ 숨바꼭질 3 본문
728x90
1. 문제

2. 문제 분석
가장 많은 사람들이 헤메는 부분이 바로
순간이동의 시간이 0초인 부분이다.
이 조건 하나로, 수빈이의 걷기보다 순간이동이 더 우선순위를 가지게 된다.
BFS는 edge간의 가중치가 없고, 무방향 그래프일 경우 최단거리를 찾게 해준다.
다익스트라는 edge간의 가중치가 있을 경우 최단거리를 찾게 해준다.
이 문제는 edge에 해당하는 {뒤로 걷기, 앞으로 걷기, 순간 이동}의 가중치가 서로 다르다.
따라서, 다익스트라 알고리즘을 사용한다.
3. 풀이
여러 풀이 방식이 있으나, deque를 사용하여 풀이해보자.
선입선출(FIFO)의 queue와, 후입선출(LIFO)의 stack의 기능을 모두 갖춘 deque로
앞과 뒷 방향에서 push를 하고, 매번 front의 값을 pop하여 연산해나간다.
다음 풀이 방식은 아래 블로그의 것을 참고하였다.
https://jdselectron.tistory.com/58
[백준 13549, c++] 숨바꼭질3(bfs, deque, priority_queue)
문제 번호 13549(https://www.acmicpc.net/problem/13549) 문제 및 입/출력 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는
jdselectron.tistory.com
- 순간 이동을 할 경우 해당 좌표는 덱의 앞에 넣는다.
- 걷는 이동을 할 경우 해당 좌표는 덱의 뒤에 넣는다.
- 좌표를 덱에서 꺼낼 때, 덱의 앞에서부터 꺼내오는 pop_front()를 사용하므로 순간이동의 우선순위를 높게 처리할 수 있다.
4. 코드
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
#define MAX_SIZE 100000+1
deque<int> DQ;
int visited[MAX_SIZE];
priority_queue<int, vector<int>, greater<int>> PQ;
int main()
{
ios_base::sync_with_stdio(false);
int n, k;
cin >> n >> k;
memset(visited, 0, sizeof(int) * MAX_SIZE);
DQ.push_back(n);
visited[n] = 1;
if (n >= k)
PQ.push(n - k);
else
{
// 순간이동이 0초 이므로, 가중치가 있는 bfs => 다익스트라 => deque or priority queue
while (!DQ.empty())
{
int num = DQ.front();
DQ.pop_front();
if (num == k)
{
PQ.emplace(visited[num] - 1);
continue;
}
// 순간이동은 우선순위에서 앞이니 push_front
if (num * 2 < MAX_SIZE && !visited[num * 2])
{
DQ.push_front(num * 2);
visited[num * 2] = visited[num];
}
// 걷는건 우선순위에서 밀리므로 push_back
if (num - 1 > 0 && !visited[num - 1])
{
DQ.push_back(num - 1);
visited[num - 1] = visited[num] + 1;
}
if (num + 1 < MAX_SIZE && !visited[num + 1])
{
DQ.push_back(num + 1);
visited[num + 1] = visited[num] + 1;
}
}
}
std::cout << PQ.top();
}
반응형
'알고리즘' 카테고리의 다른 글
[CodeForce 327A] Fliping Game C++ 풀이 - Maximum SubArray로 풀기 (0) | 2024.04.08 |
---|---|
[Codeforce 1003C] C. Intense Heat (0) | 2024.03.15 |
[백준 1967] C++ 트리의 지름 (1) | 2024.02.13 |
[백준 1753번] C++ 최단경로 (2) | 2024.02.13 |
[백준 11053] C++ 가장 긴 증가하는 수열 (0) | 2024.02.11 |