※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 24955번 문제인 숫자 이어 붙이기이다.
문제는 아래 링크를 확인하자.

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

 

24955번: 숫자 이어 붙이기

철수는 수를 이어 붙이는 놀이를 좋아한다. 1과 2를 이어 붙이면 12가 되고, 17과 13을 이어 붙이면 1713이 된다. 100과 1000을 이어 붙이면 1001000이 된다. 1과 2를 이어 붙이되, 순서를 반대로 해서 2와

www.acmicpc.net

평범한 BFS를 하며 숫자를 이어붙여가는 문제이다.

 

숫자를 길게 이어붙이면 정수로 연산하기 귀찮아지니, 숫자를 이어붙일 때마다 to_string과 stoull을 이용하여 답을 저장해나가자. (정답으로 출력해야하는 나머지값은 일정하게 유지된다.)

 

1,000,000,007과 1,000,000,000을 이어붙인 10,000,000,001,000,000,000은 2^63을 넘지만 2^64은 넘지 않으므로 stoull을 이용해 문제를 해결할 수 있다.

 

아래는 제출한 소스코드이다.

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

int N, Q;
int ss, ee;
string s[1001];
vector<int> G[1001];
int ans[1001];
int visited[1001];

void bfs() {
	memset(ans, 0, sizeof(ans));
	memset(visited, 0, sizeof(visited));
	queue<int> que;
	que.push(ss);
	visited[ss] = 1;
	while (!que.empty()) {
		int cur = que.front(); que.pop();
		ans[cur] = stoull(to_string(ans[cur]) + s[cur]) % 1000000007;
		for (auto node : G[cur]) {
			if (visited[node] == 0) {
				visited[node] = 1;
				ans[node] = ans[cur];
				que.push(node);
			}
		}
	}

	cout << ans[ee] << '\n';
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> Q;
	for (int i = 1; i <= N; i++) cin >> s[i];
	for (int i = 1; i < N; i++) {
		int x, y; cin >> x >> y;
		G[x].emplace_back(y);
		G[y].emplace_back(x);
	}

	while (Q--) {
		cin >> ss >> ee;
		bfs();
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 25025 // C++] 다항식 계산  (0) 2022.07.14
[BOJ 24956 // C++] 나는 정말 휘파람을 못 불어  (0) 2022.07.13
[BOJ 4011 // C++] 기름 파기  (0) 2022.07.11
[BOJ 14713 // C++] 앵무새  (0) 2022.07.10
[BOJ 25024 // C++] 시간과 날짜  (0) 2022.07.10

+ Recent posts