백준
[백준_20310번] 타노스
빙수빈수
2023. 4. 14. 14:43
[문제]
어느 날, 타노스는 0과 1로 이루어진 문자열 를 보았다. 신기하게도, S가 포함하는 0의 개수와 S가 포함하는 1의 개수는 모두 짝수라고 한다.
갑자기 심술이 난 타노스는 S를 구성하는 문자 중 절반의 0과 절반의 1을 제거하여 새로운 문자열 S를 만들고자 한다. S로 가능한 문자열 중 사전순으로 가장 빠른 것을 구하시오.
[코드]
import java.util.*;
public class BaekJoon_20310 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.next();
char[] ch=str.toCharArray();
int one=0;
int zero=0;
for(int i=0;i<str.length();i++) {
if(str.charAt(i)=='1')
one++;
else
zero++;
}
// 문자열의 0과 1의 개수 중 반을 없애야 함
one/=2;
zero/=2;
// 앞자리에 1이 오면 최솟값이 될 수 없으므로 앞에있는 1부터 지우기
for(int i=0;i<ch.length;i++) {
if(one>0&&ch[i]=='1') {
ch[i]='X';
one--;
}
}
// 0은 최대한 앞에 있어야 하므로 뒤에있는 0부터 지우기
for(int i=ch.length-1;i>=0;i--) {
if(zero>0&&ch[i]=='0') {
ch[i]='X';
zero--;
}
}
// 결과 출력
String result="";
for(int i=0;i<ch.length;i++)
if(ch[i]=='0'||ch[i]=='1')
result+=ch[i];
System.out.println(result);
}
}
[고찰]
이번 문제는 어떻게 최솟값을 만들 수 있을지만 체크하면 쉽게 풀리는 문제였다. 0은 최대한 앞에만 위치하여 단위가 늘어나지 않게 해야하고, 1은 최대한 뒤에 위치해 값이 커지지 않게 해야한다. 즉, 0은 뒤에서부터 지우고 1은 앞에서부터 지우면 되는 문제였다.