GitHubSeob

C++ / 백준 / 1963 / 소수 경로 본문

Baekjoon/Gold

C++ / 백준 / 1963 / 소수 경로

GitHubSeob 2021. 9. 15.

문제

https://www.acmicpc.net/problem/1963

 

1963번: 소수 경로

소수를 유난히도 좋아하는 창영이는 게임 아이디 비밀번호를 4자리 ‘소수’로 정해놓았다. 어느 날 창영이는 친한 친구와 대화를 나누었는데: “이제 슬슬 비번 바꿀 때도 됐잖아” “응 지금

www.acmicpc.net

문제풀이

A에서 B로 숫자를 바꾸는 과정에서도 항상 소수를 유지해야 한다.

먼저 에라토스테네스의 체를 이용하여 소수를 구한다.

prime벡터는 소수가 아니면 false를, 소수이면 true이다.

숫자를 바꿀 때 임시로 int형에서 string형으로 바꾸고 이중 반복문으로 모든 자리를 0부터 9까지 바꾼다.

바꾼 번호가 목표하는 번호와 같다면 cnt+1을 하여 출력해준다.

그렇지 않다면 다시 int형으로 숫자를 바꾼다.

세 가지 조건인 천의 자리가 0, 처음 만든 수, 소수임을 만족하면 큐에 넣는다.

큐가 빌 때까지 출력이 안되었다면 만들 수 없는 수 이므로 Impossible을 출력한다.

 

 

코드

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>
using namespace std;

vector<bool>prime;

void BFS(int start, string target, vector<bool>visit) {
	int idx = 0;
	int idx2 = 0;
	queue<pair<int, int>>q;
	q.push({ start,0 });
	visit[start] = true;
	while (!q.empty()) {
		int num = q.front().first;
		int cnt = q.front().second;
		q.pop();

		for (idx = 0; idx < 4; ++idx) {
			for (idx2 = 0; idx2 <= 9; ++idx2) {
				string s_num = to_string(num);
				s_num[idx] = (char)(idx2 + 48);
				if (s_num == target) {
					cout << cnt + 1 << '\n';
					return;
				}
				else {
					int n_num = stoi(s_num);
					if (n_num / 1000 != 0 && !visit[n_num] && prime[n_num]) {
						visit[n_num] = true;
						q.push({ n_num, cnt + 1 });
					}
				}
			}
		}
	}
	cout << "Impossible" << '\n';
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	int T = 0;
	cin >> T;

	int idx = 0;
	prime = vector<bool>(10000, true);
	int num = 2;

	for (num = 2; num <= 100; ++num) {
		for (idx = 1000 / num; num * idx < 10000; ++idx)
			prime[idx * num] = false;
	}
	vector<bool>visit(10000, false);

	while (T--) {
		int num1 = 0, num2 = 0;
		cin >> num1 >> num2;
		if (num1 == num2) cout << "0\n";
		else
			BFS(num1, to_string(num2), visit);
	}
}

'Baekjoon > Gold' 카테고리의 다른 글

C++ / 백준 / 1525 / 퍼즐  (0) 2021.09.18
C++ / 백준 / 9019 / DSLR  (0) 2021.09.16
C++ / 백준 / 1451 / 직사각형으로 나누기  (0) 2021.09.09
C++ / 백준 / 1107 / 리모컨  (0) 2021.09.08
C++ / 백준 / 1744 / 수 묶기  (0) 2021.09.08