티스토리 뷰
반응형
백준 1697번 숨바꼭질
https://www.acmicpc.net/problem/1697
정답 코드
#include <iostream>
#include <queue>
using namespace std;
const int A = 100001;
int arr[A], n, k;
queue<pair<int, int>> q;
int bfs() {
arr[n] = 1;
q.push({ n,0 });
while (!q.empty())
{
int pos = q.front().first;
int time = q.front().second;
q.pop();
if (pos == k)
return time;
int arr2[3] = { pos + 1, pos - 1, pos * 2 };
for (int x = 0; x < 3; x++) {
int newpos = arr2[x];
if (newpos >= 0 && newpos < A) {
if (arr[newpos] == 0) {
q.push({ newpos,time + 1 });
arr[newpos] = 1;
}
}
}
}
}
int main()
{
cin >> n >> k;
cout << bfs();
return 0;
}
문제 풀이
bfs를 이용해서 풀 수 있는 문제입니다. 보통의 bfs들은 다차원 배열을 이용하지만 이 경우에는 일차원배열을 이용합니다. 먼저 arr[n]=1을 선언합니다. 시작점이라는 의미입니다. 그리고 나서 queue에는 ({n,0})을 삽입합니다. n은 출발점이고 0은 걸린 시간입니다. 이제 q가 빌 때까지 while문을 돌립니다. 만약 pos==k라면 time을
리턴합니다. 그게 아니라면 arr2배열에 움직일 수 있는 범위 3가지를 삽입하고 반복문을 돌립니다. 이 값들을
각각 newpos에 담은 후 이 값이 0보다 크거나 같고 100001보다 작을 때 newpos이 방문한 곳이 아니라면 q에 ({newpos,time+1})을 삽입합니다.
그리고 arr[newpos]=1로 만들어줍니다.
전체적으로 정리하자면 queue를 돌리면서 큐 안의 좌표값과 K가 같으면 time을 리턴해주고 그게 아니라면 새로운 배열에 움직일 수 있는 조건3개를 추가하고 반복문을 돌리면서 제한된 범위 안에서 움직일 수 있도록
하면 됩니다.
반응형
'Algorithm > BOJ' 카테고리의 다른 글
백준 1735번 C++ (0) | 2023.07.25 |
---|---|
백준 1712번 C++ (0) | 2023.07.25 |
백준 1676번 C++ (0) | 2023.07.25 |
[C/C++] 백준 1644번 - 소수의 연속합 (0) | 2023.07.25 |
백준 1629번 C++ (0) | 2023.07.24 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 이분 매칭
- 알고리즘 공부
- java
- C++ Stack
- 자바
- js
- DP
- 자바스크립트
- C++
- 스프링 부트 crud 게시판 구현
- 카운팅 정렬
- CSS
- 유클리드 호제법
- 에라토스테네스의 체
- 알고리즘
- 세그먼트 트리
- 백준
- Do it!
- 우선순위 큐
- HTML5
- DFS
- html
- c++ string
- BFS
- 반복문
- 백준 풀이
- 유니온 파인드
- 투 포인터
- 자료구조
- 스택
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함