Patrick's Devlog

[BOJ/C++] 타노스(20310번) 본문

Algorithm/Algorithms Practice

[BOJ/C++] 타노스(20310번)

Patrick_ 2022. 12. 5. 15:57

1. 개요

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

 

20310번: 타노스

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

www.acmicpc.net

1-1. 설명

어느날 타노스는 0과 1로 이루어진 문자열 S를 보았다. 심술이난 타노스는 S를 구성하는 문자 중 0과 1을 각각 절반씩 제거해 새로운 문자열 S'를 만들고자 한다. S'로 가능한 문자열 중 사전순으로 가장 빠른 것을 구하는 프로그램을 작성한다.

1-2. 제한 사항

 - S의 길이는 2이상 500이하, 각각 0과 1은 짝수개씩 이루어짐


2. 구현

2-1. 풀이

문제를 제대로 읽지 않아 단순히 0과 1을 없애고 사전순으로 정렬하였으나, 문자를 없앤 그 중 사전순으로 빠른 순임을 인지하고 0은 뒤에서, 1은 앞에서 절반을 없애 결과를 도출하였다. 

2-2. 코드

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    string S, result;
    cin >> S;
    int zeroCnt = 0, oneCnt = 0, count = 0;
    for (char ch : S) {
        if (ch == '0') zeroCnt += 1;
        else oneCnt += 1;
    }
    zeroCnt /= 2;
    oneCnt /= 2;

    int index = 0;
    while (oneCnt != 0) {
        if (S[index] == '1') {
            S.erase(index, 1);
            oneCnt -= 1;
        }
        else index += 1;
    }

    index = S.size() - 1;
    while (zeroCnt != 0) {
        if (S[index] == '0') {
            S.erase(index, 1);
            zeroCnt -= 1;
        }
        index -= 1;
    }

    cout << S;

    return 0;
}