250x250
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
- Calendar
- NIO
- set
- deque
- math
- spring boot
- html
- CSS
- map
- 스택
- javascript
- 큐
- union_find
- 힙덤프
- Union-find
- 스프링부트
- JPA
- GC로그수집
- priority_queue
- Properties
- sql
- date
- BFS
- alter
- 리소스모니터링
- Java
- string
- scanner
- dfs
- List
Archives
- Today
- Total
매일 조금씩
백준 1697번 : 숨바꼭질 [C++] 본문
728x90
반응형
BFS를 활용하면 풀수 있는 문제다.
관련 포스팅을 참고한 후 풀었다.
중요한 건 한번 방문한 곳은 다시 방문하지 않게 해야한다는 것.
pair를 사용해서 (위치, 시간) 쌍으로 queue에 넣었다.
while문이 한바퀴를 돌 때 같은 초에 갈수 있는 같은 레벨의 위치들이 queue에 push되는데
queue에 일단 push 되면 같은 초(같은레벨) 인지 알 수 없기 때문이다.
#include <iostream>
#include <queue>
#include <cstring> //memset
using namespace std;
const int MAX = 1000000 + 1;
int N, K;
bool visited[MAX];
int minSecond(int N, int K) {
queue<pair<int, int>> q;
q.push(make_pair(N, 0));
visited[N] = true;
// 한번 돌때 같은'초'(트리에서 같은 레벨)에 갈수 있는 곳을 큐에 넣음.
// 큐 안에선 같은 레벨인지 구분이 안되기 때문에 위치와 지점을 함께 저장하는 것이 필요.
while (!q.empty()) {
int curLoc = q.front().first;
int curSec = q.front().second;
q.pop();
// 도착했을 때
if (curLoc == K) {
return curSec;
}
// 한 칸 뒤로 갈 때
if (0 <= curLoc - 1 && !visited[curLoc - 1]) {
q.push(make_pair(curLoc - 1, curSec + 1));
visited[curLoc - 1] = true;
}
// 한 칸 앞으로 갈 때
if (curLoc + 1 < MAX && !visited[curLoc + 1]) {
q.push(make_pair(curLoc + 1, curSec + 1));
visited[curLoc + 1] = true;
}
// 두배로 앞으로 갈 때
if (curLoc * 2 < MAX && !visited[curLoc * 2]) {
q.push(make_pair(curLoc * 2, curSec + 1));
visited[curLoc * 2] = true;
}
}
}
int main(void) {
cin >> N >> K;
cout << minSecond(N, K) << endl;
return 0;
}
728x90
반응형
'알고리즘 > Graph (DFS, BFS)' 카테고리의 다른 글
백준 14502번 : 연구소 [C++] (0) | 2020.08.08 |
---|---|
백준 11724번 : 연결 요소의 개수 [C++] (0) | 2020.08.08 |
백준 1012번 : 유기농 배추 [C++] (0) | 2020.08.08 |
백준 7576번 : 토마토 (0) | 2020.08.07 |
백준 2667번 : 단지 번호 붙이기 (0) | 2020.08.07 |