https://www.acmicpc.net/problem/20310
문제 설명
0과 1로 이루어진 문자열 S가 있는데, S가 포함하는 0의 개수와 1의 개수는 각각 짝수이다.
S를 구성하는 문자 중 절반의 0과 절반의 1을 제거하여 새로운 문자열 S'를 만들 때, 만들 수 있는 문자열 중 사전 순으로 가장 빠른 S'를 구해야 한다.
(2 <= len(S) <= 500)
해결
사전 순으로 봤을 때 0보다 1이 더 빠르다.
따라서 절반의 0을 제거할 때는 뒤에서부터, 절반의 1을 제거할 때는 앞에서부터 제거해야 한다는 것을 알 수 있다.
주의
절반의 0과 절반의 1을 없애고 문자열을 재배열하라는 것이 아니다.
문자열의 순서 자체는 유지하면서 0과 1을 없애야 한다.
코드
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
char str[501];
int zero = 0, one = 0;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> str;
int len = strlen(str);
for (int i = 0; i < len; i++) {
if (str[i] == '0') zero++;
else one++;
}
zero /= 2;
one /= 2;
for (int i = 0; i < len; i++) {
if (str[i] == '1' && one >= 1) {
one--;
str[i] = '6';
}
else if (one == 0) break;
}
for (int i = len - 1; i >= 0; i--) {
if (str[i] == '0' && zero >= 1) {
zero--;
str[i] = '6';
}
else if (zero == 0) break;
}
for (int i = 0; i < len; i++) {
if (str[i] == '6') continue;
cout << str[i];
}
}
'백준' 카테고리의 다른 글
[백준/c++] BJO 26215 - 눈 치우기 (0) | 2023.09.28 |
---|---|
[백준/c++] BOJ 11508 - 2+1세일 (0) | 2023.09.19 |
[백준/c++] BOJ 12886 - 돌 그룹 (0) | 2023.09.19 |
[백준/c++] BOJ 1946 - 신입사원 (0) | 2023.09.19 |
[백준/c++] BOJ 14889 - 스타트와 링크 (1) | 2023.09.02 |