본문 바로가기

백준

[백준/c++] BOJ 20310 - 타노스

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

 

20310번: 타노스

어느 날, 타노스는 0과 1로 이루어진 문자열 $S$를 보았다. 신기하게도, $S$가 포함하는 0의 개수와 $S$가 포함하는 1의 개수는 모두 짝수라고 한다. 갑자기 심술이 난 타노스는 $S$를 구성하는 문자

www.acmicpc.net

 

문제 설명

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];
	}
}