Tech/Algorithm

[BOJ] 백준 1515 수 이어 쓰기 c++ (문자열, 구현)

0m1n 2023. 7. 6. 13:00
728x90
반응형

문제 출처 : https://www.acmicpc.net/problem/1515

 

1515번: 수 이어 쓰기

세준이는 1부터 N까지 모든 수를 차례대로 공백없이 한 줄에 다 썼다. 그리고 나서, 세준이가 저녁을 먹으러 나간 사이에 다솜이는 세준이가 쓴 수에서 마음에 드는 몇 개의 숫자를 지웠다. 세준

www.acmicpc.net


풀이

브루트포스로 숫자를 증가시키며 풀이하는 문제이다.

 

예시로 입력 - 234092 가 있다고 하자.

처음 포인터는 0번(2)를 가리킨다.

처음 숫자(num)을 0부터 시작해서 반복문을 돌려 증가시킨다.

num 0 .. 1 .. 2에서 포인터가 가리키는 2와 일치하게 된다. 이 경우 포인터를 증가시킨다.

 

이제 포인터는 1번(3)을 가리키고, num은 3이다.

포인터의 수와 num이 일치하므로 또 포인터를 증가시킨다.

 

이제 포인터는 2번(4)을 가리키고, num은 4이다.

포인터의 수와 num이 일치하므로 또 포인터를 증가시킨다.

 

이제 포인터는 3번(0)을 가리키고, num은 5이다.

5..6..7..8..9..10 에서 10은 [1, 0] 에서 0이 있으므로 포인터의 수와 일치한다.

 

이렇게 증가하다 포인터가 입력한 문자열의 길이와 같아지면 정답(num)을 출력하면 된다. 


코드

#include <bits/stdc++.h>

using namespace std;

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

	string str = "";
	cin >> str;

	int num = 0, ptr = 0;

	while(num++ < 30000) {
		string num2str = to_string(num);
		for(int i = 0; i < num2str.length(); i++) {
			// num의 요소 중 일치하는 것이 있으면 포인터 증가
			if(str[ptr] == num2str[i]) {
				ptr++;
			}
			if(ptr == str.length()) {
				cout << num;
				return 0;
			}
		}
	}
	return 0;
}
728x90
반응형