※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 17394번 문제인 핑거 스냅이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/17394
17394번: 핑거 스냅
[어벤져스] 시리즈를 보지 않은 사람이라도 ‘인피니티 건틀렛’이 무엇인지는 다들 알 것이다. 그래도 모르는 사람들을 위해 설명을 하자면, 인피니티 스톤이 모두 모인 인피니티 건틀렛을 끼
www.acmicpc.net
BFS를 이용하여 가장 빠르게 목적이 되는 수까지 도달하는 횟수를 세자.
각 숫자에 도달할 때마다 "A이상 B이하 && 이 숫자는 소수" 라는 조건을 만족하는지를 체크하면 된다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
bool sieve[1000001];
int visited[1000001];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
sieve[0] = sieve[1] = 1;
for (int i = 2; i < 317; i++) {
if (sieve[i]) continue;
for (int j = i * i; j <= 1000000; j += i) {
sieve[j] = 1;
}
}
int T; cin >> T;
while (T--) {
memset(visited, 0, sizeof(visited));
queue<int> que;
int N, A, B; cin >> N >> A >> B;
que.push(N);
visited[N] = 1;
int ans = -1;
while (!que.empty()) {
int current = que.front(); que.pop();
if (A <= current && current <= B && !sieve[current]) {
ans = visited[current] - 1;
break;
}
if (!visited[current / 2]) {
visited[current / 2] = visited[current] + 1;
que.push(current / 2);
}
if (!visited[current / 3]) {
visited[current / 3] = visited[current] + 1;
que.push(current / 3);
}
if (current > 0) {
if (!visited[current - 1]) {
visited[current - 1] = visited[current] + 1;
que.push(current - 1);
}
}
if (current < 100000) {
if (!visited[current + 1]) {
visited[current + 1] = visited[current] + 1;
que.push(current + 1);
}
}
}
cout << ans << '\n';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 1193 // C++] 분수찾기 (0) | 2021.08.29 |
---|---|
[BOJ 11729 // C++] 하노이 탑 이동 순서 (0) | 2021.08.28 |
[BOJ 11238 // C++] Fibo (0) | 2021.08.26 |
[BOJ 17080 // C++] 결함 게임 (0) | 2021.08.25 |
[BOJ 2655 // C++] 가장높은탑쌓기 (0) | 2021.08.24 |