문제
https://www.acmicpc.net/problem/1251
문제 요약
알파벳 소문자로 이루어진 단어를 가지고 아래와 같은 과정을 진행한다.
1. 단어에서 임의의 두 부분을 골라 단어를 쪼갠다.
(각각은 적어도 길이가 1이상인 단어이다.)
2. 나누어진 세 개의 작은 단어들을 앞뒤로 뒤집고, 원래의 순서대로 합친다.
위 과정의 결과 문자열 중 사전 순으로 가장 앞서는 단어를 출력한다.
코드
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string str;
string first_str;
string second_str;
string third_str;
string res = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
int main()
{
cin >> str;
for (int i = 0; i < str.size() - 2; i++) {
for (int j = i + 1; j < str.size() - 1; j++) {
first_str = str.substr(0, i + 1);
second_str = str.substr(i + 1, j - i);
third_str = str.substr(j + 1);
reverse(first_str.begin(), first_str.end());
reverse(second_str.begin(), second_str.end());
reverse(third_str.begin(), third_str.end());
res = min(first_str + second_str + third_str, res);
}
}
cout << res;
return 0;
}
코드 설명
1. 단어 str을 입력 받는다.
2. str을 세 부분으로 나누고 각각을 뒤집는다.
3. 세 부분을 다시 합쳐 결과 문자열을 구한다.
4. 위 과정을 이중 반복문을 통해 가능한 경우의 수를 모두 탐색한다.
(i와 j는 문자열을 세 부분으로 나눌 때, 각 부분의 경계 인덱스를 의미한다.)
고찰
1. substr
: string 클래스에서 문자열의 특정 부분을 추출하는 데 사용되는 멤버 함수
str 문자열의 0번 인덱스부터 길이 i + 1만큼의 부분 문자열을 추출하는 코드
first_str = str.substr(0, i + 1);
str 문자열의 j + 1번 인덱스부터 마지막 인덱스까지의 부분 문자열을 추출하는 코드
third_str = str.substr(j + 1);
2. reverse
: 문자열을 거꾸로 뒤집는데 사용되는 함수
first_str 문자열을 거꾸로 뒤집는 코드
reverse(first_str.begin(), first_str.end());
3. min을 통한 문자열의 사전 순 비교
=> algoritm 라이브러리의 min 함수를 통해 두 문자열의 아스키 코드를 비교하여 사전 순 비교를 할 수 있다.
'Algorithm Problems > 구현' 카테고리의 다른 글
[백준/C++] 13909번: 창문 닫기 (1) | 2024.12.26 |
---|---|
[백준/C++] 1244번: 스위치 켜고 끄기 (1) | 2024.10.17 |
[백준/C++] 4072번: Words (0) | 2024.06.12 |
[백준/C++] 4447번: 좋은놈 나쁜놈 (0) | 2024.04.15 |
[백준/C++] 1718번: 암호 (1) | 2024.04.06 |