문제 링크: https://www.acmicpc.net/problem/2993

 

문자열을 적당히 세조각으로 나눠 각 세조각을 reverse를 해주고 다시 붙이면 됩니다.

for문 2개만 있으면 됩니다.

 

위 그림처럼 적당히 i, j를 고르면 3조각을 나눌 수 있습니다. 이때 i, j의 조건을 잘 설정해줘야겠죠

i의 범위는 [0, sz-3], j의 범위는 [i+1, sz-2]으로 하면 되겠습니다

 

#pragma GCC optimize ("Ofast")

#define _CRT_SECURE_NO_WARNINGS
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
#include <bits/stdc++.h>
using namespace std;


int main()
{
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
#endif

	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	string s;
	cin >> s;
	
	auto sz = s.size();
	string ans(sz, 'z');
	
	for (int i = 0; i < sz-2; ++i) {
		for (int j = i + 1; j < sz-1; ++j) {
			string tmp = s;

			
			reverse(tmp.begin(), tmp.begin() + i+1);
			reverse(tmp.begin()+i+1, tmp.begin() + j+1);
			reverse(tmp.begin()+j+1, tmp.end());


			ans = min(ans, tmp);
		}
	}

	cout << ans << '\n';

	return 0;
}

std::reverse를 사용했습니다.

반응형

'Online Judge > 백준' 카테고리의 다른 글

[백준][C++] 1780: 종이의 개수  (0) 2020.07.11
[백준][C++] 1764: 듣보잡  (0) 2020.07.10
[백준][C++] 1806: 부분합  (0) 2020.07.08
[백준][C++] 2473: 세 용액  (0) 2020.07.08
[백준][C++] 2470: 두 용액  (0) 2020.07.08