일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Modern C++
- Bronze
- Euclidean
- PrefixSum
- level3
- Gold
- effective C++
- dirtyflag pattern
- Silver
- level1
- 프로그래머스
- solid 원칙
- 3D RPG
- BOJ
- Project
- Flyweight Pattern
- Zenject
- 8-Puzzle
- 프로세스 상태
- SWEA
- binary search
- stack
- trie
- knapsack Problem
- Unity
- LEVEL2
- programmers
- two pointer
- BFS
- algorithm
Archives
- Today
- Total
Patrick's Devlog
[BOJ/C++] 숨바꼭질(1697번) 본문
1. 개요
https://www.acmicpc.net/problem/1697
1697번: 숨바꼭질
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
1-1. 설명
수빈이는 동생과 숨바꼭질을 한다. 수빈이는 현재 점 N에 있고, 동생은 점 K에 있다. 수빈이는 걷거나 순간이동이 가능한데, 걸을 때 1초후 +1이거나 -1 하면 된다. 순간이동을 할 때에는 *2를 해준 위치로 이동하게 된다. 수빈이와 동생 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성한다.
1-2. 제한 사항
- 첫 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어지며, N과 K는 0 이상 100,000 이하
2. 구현
2-1. 풀이
BFS를 통해서 구현해냈다. +1과 -1, *2 후의 결과를 큐에 저장하는 식으로 진행하였다. 방문하지 않은 점은 0, 방문한 점은 1 이상임을 통해 방문 여부와 이동 시간 또한 같이 저장하였다.
2-2. 코드
#include <iostream>
#include <algorithm>
using namespace std;
constexpr size_t MAX_NUM = 100001;
int queue[MAX_NUM];
int visited[MAX_NUM];
void BFS(int start, int end);
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N, K;
cin >> N >> K;
BFS(N, K);
cout << visited[K];
return 0;
}
void BFS(int start, int end) {
int front = -1, rear = -1;
queue[++rear] = start;
visited[start] = 0; // 시작점
while (front != rear) {
int cur = queue[++front];
if (cur == end) break; // 현재 점이 끝점이라면 종료(start == end 조건으로 인해 추가)
if (cur - 1 >= 0 && visited[cur - 1] == 0) { // 현재 점에서 -1 할 때
queue[++rear] = cur - 1;
visited[cur - 1] = visited[cur] + 1;
}
if (cur + 1 <= MAX_NUM && visited[cur + 1] == 0) { // 현재 점에서 +1 할 때
queue[++rear] = cur + 1;
visited[cur + 1] = visited[cur] + 1;
}
if (cur * 2 >= 0 && cur * 2 <= MAX_NUM && visited[cur * 2] == 0) { // 현재 점에서 순간이동 할 때
queue[++rear] = cur * 2;
visited[cur * 2] = visited[cur] + 1;
}
}
}
'Algorithm > Algorithms Practice' 카테고리의 다른 글
[BOJ/C++] 스티커(9465번) (0) | 2022.12.15 |
---|---|
[BOJ/C++] 숨바꼭질 3(13594번) (0) | 2022.12.14 |
[BOJ/C++] 상자넣기(1965번) (0) | 2022.12.12 |
[BOJ/C++] 최대 힙(11279번) (0) | 2022.12.08 |
[BOJ/C++] 택배 배송(5972번) (0) | 2022.12.07 |