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

 

이번에 볼 문제는 백준 6137번 문제인 문자열 생성이다.
문제는 아래 링크를 확인하자.

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

 

6137번: 문자열 생성

첫 번째 줄에 문자열 S의 길이 N이 주어진다. (N <= 2,000) 이후 N개의 줄에 S를 이루는 문자들이 주어진다.

www.acmicpc.net

주어진 문자열의 맨 앞 또는 뒤의 글자를 하나씩 떼어내 만들어질 수 있는 모든 문자열 중 사전순으로 가장 빠른 문자열을 만드는 문제이다.

 

만약 주어진 문자열의 맨 앞글자와 뒷글자가 다르다면 사전순으로 먼저 오는 글자를 떼 새 문자열의 다음 글자로 사용하면 된다.

 

주어진 문자열의 맨 앞글자와 뒷글자가 같은 경우, 주어진 문자열이 팰린드롬(뒤집어 읽어도 같은 문자열, 회문) 문자열이 아니라면 앞에서부터 봤을 때와 뒤에서부터 봤을 때 처음으로 다른 글자가 나오게 되는데, 그중 사전순으로 빠른 쪽의 글자를 떼 새 문자열의 다음 글자로 사용해야 한다. 그 위치의 글자를 넣을 순서가 왔을 때 사전순으로 더 빠른 문자열을 얻으려면 어떻게 해야하는지를 떠올려보면 좋다. 팰린드롬 문자열의 경우 앞과 뒤 중 어떤 글자를 떼어도 상관없다.

 

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

#include <iostream>
using namespace std;

char s[2000];

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

	int N; cin >> N;
	for (int i = 0; i < N; i++) cin >> s[i];
	int L = 0, R = N - 1;
	int cnt = 0;
	while (L <= R) {
		int l = L, r = R;
		bool ispal = 1;
		while (l < r) {
			if (s[l] != s[r]) {
				ispal = 0;
				break;
			}
			l++; r--;
		}
		if (ispal) {
			cout << s[L];
			L++;
		}
		else {
			if (s[l] < s[r]) {
				cout << s[L];
				L++;
			}
			else {
				cout << s[R];
				R--;
			}
		}
		cnt++;
		if (cnt == 80) {
			cnt = 0;
			cout << '\n';
		}
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 25187 // C++] 고인물이 싫어요  (0) 2022.08.18
[BOJ 17020 // C++] Train Tracking 2  (0) 2022.08.17
[BOJ 5623 // C++] 수열의 합  (0) 2022.08.15
[BOJ 25186 // C++] INFP 두람  (0) 2022.08.14
[BOJ 25185 // C++] 카드 뽑기  (0) 2022.08.14

+ Recent posts