- 백준 20310 (타노스) - Java
- 아주 간단하게 0과 1의 count를 세고, 그 숫자를 반씩 해서 앞에는 0, 뒤에는 1이 오도록 하면 된다고 생각한 문제이다.
- 예를 들어, 01010101이면 0이 4개고, 1이 4개니까 그거를 2개씩으로 줄이고, 0011로 만들면 된다... 라고 생각하고 구현하였다.
- 그런데 막상 제출하니
25점으로 나왔다...
- 문제를 잘 못 읽었나해서 다시 읽어보았는데도 고작 2줄짜리 문제라서 다른 문제나 조건이 있지는 않았다.
- 계속 고민을 하다가 어느새 1시간이 지나서... 결국은 검색을 하게 되었는데
- 해당 count를 세서 절반하는 것은 맞지만 처음 주어진 문자열에서 앞에서 1들을 제거하고 뒤에서 0들을 제거하는 방식으로 해서 제출하라고 한다.
- 해보니
100점이 나오기는 하는데... 왜 인지는 아직도 잘 모르겠음.
- 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 처음 문자 읽기
String S = br.readLine();
// 처음 문자 만큼의 길이를 가진 문자열 생성
char[] arr = new char[S.length()];
// 처음 문자의 0과 1의 갯수 변수
int count0 = 0;
int count1 = 0;
for (int i = 0; i < S.length(); i++) {
// 해당 문자를 문자열에 할당
arr[i] = S.charAt(i);
// 0이 나오면 count0 + 1, 1이 나오면 count1 + 1
if (S.charAt(i) == '0') count0++;
else count1++;
}
// 0과 1을 센 각각을 절반으로 나눔
// 문제에서 0과 1은 항상 짝수만큼 있다고 지정
count0 = count0 / 2;
count1 = count1 / 2;
// 앞에서부터 1이 나오면 제거 (없는 거로)
for (int i = 0; i < S.length() && count1 != 0; i++) {
if (arr[i] == '1') {
count1--;
arr[i] = 0;
}
}
// 뒤에서부터 0이 나오면 제거 (없는 거로)
for (int i = S.length() - 1; i >= 0 && count0 != 0; i--) {
if (arr[i] == '0') {
count0--;
arr[i] = 0;
}
}
// 새로 할당할 StringBuilder 생성
StringBuilder res = new StringBuilder();
// 0이 아니면 StringBuilder에 할당
for (int i = 0; i < S.length(); i++) {
if (arr[i] != 0)
res.append(arr[i]);
}
// 출력
bw.write(String.valueOf(res));
bw.flush();
bw.close();
br.close();
}
}