본문 바로가기
Baekjoon/[7] 기타

[백준] 20310번 타노스 JAVA (자바) 풀이

by Poorm 푸름 2024. 1. 30.

문제 20310

  • 0과 1로 이루어진 문자열 S
  • S가 포함하는 0의 개수와 1의 개수는 모두 짝수
  • 갑자기 타노스는 구성하는 문자 중 절반의 0과 절반의 1을 제거하여 새로운 문자열 S'를 만들고자 한다 
  • S'로 가능한 문자열 중 사전순으로 가장 빠른 것을 구해라

 

 

[입력]

 

 :  문자열 S

 

 

 [출력]


 :  문자열 중 사전순으로 가장 빠른 것을 출력

     

 

 [코드]

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String s = in.readLine();

        int num0 = 0;

        int num1 = 0;

        StringBuilder sb = new StringBuilder();

        for(int i = 0; i < s.length(); i++){
            char c = s.charAt(i);
            sb.append(c);
            if(c == '0') num0++;
            else num1++;
        }

        num0 /= 2;
        num1 /= 2;

        for(int i = 0; i < sb.length(); i++){
            if(sb.charAt(i) == '1') {
                sb.setCharAt(i, '2');
                num1--;
            }
            if(num1 == 0) break;
        }

        for(int i = sb.length() - 1; i > -1; i--){
            if(sb.charAt(i) == '0') {
                sb.setCharAt(i, '2');
                num0--;
            }
            if(num0 == 0) break;
        }

        for(int i = 0; i < sb.length(); i++){
            if(sb.charAt(i) == '1' || sb.charAt(i) == '0') System.out.print(sb.charAt(i));
        }
    }
}

 

 [해설]
     

 :  String s = in.readLine(); 첫째줄 입력 (문자열)
    int num0 = 0;  0개수
    int num1 = 0;  1개수

 

 :  StringBuilder sb = new StringBuilder();

 :  for(int i = 0; i < s.length(); i++){

          char c = s.charAt(i);  문자 하나씩 보기
          sb.append(c);  각 문자를 sb에 추가하고 각 문자 객체 카운트
          if(c == '0') num0++;  각 문자 카운트
          else num1++;
    }

 :  num0 /= 2;  값 절반으로 나누기
    num1 /= 2;

 :  for(int i = 0; i < sb.length(); i++){
          if(sb.charAt(i) == '1') {  1을 만나면 

               sb.setCharAt(i, '2');  문자를 2로 바꾸고
               num1--;  num1 감소
          }
          if(num1 == 0) break;  절반 모두 제거하면 종료
    }

 :  for(int i = sb.length() - 1; i > -1; i--){ 

          if(sb.charAt(i) == '0') {  0을 만나면
               sb.setCharAt(i, '2');  문자를 2로 바꾸고
               num0--;  num0 감소
          }
          if(num0 == 0) break;  절반 모두 제거하면 종료
    }

 :  for(int i = 0; i < sb.length(); i++){  문자가 1이나 0인 경우만 출력
          if(sb.charAt(i) == '1' || sb.charAt(i) == '0') Systehttp://m.out.print(sb.charAt(i));
    }
    


 

 

이제 풀어보러 갈께요 :)



* 독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *

 

 

20310번: 타노스

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

www.acmicpc.net