본문 바로가기
[ 다먹살 ]/- Coding

[백준] 20310 타노스

by 엉망으로살기 2023. 4. 20.
반응형

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

 

20310번: 타노스

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

www.acmicpc.net

 

이 문제는 정의 자체가 개인적으로는 조금 애매한 것 같다. 처음에는 자리 자체를 재배열 할 수 있다고 생각해서 구현을 했었는데 알고보니 문자의 자리는 옮기면 안되는 조건이 있었다. 

자리수가 적을 때에는 두 케이스 답이 같아서 문제가 없었지만 처음 제출했을 때에는 부분점수로 25점만 맞은 걸 보니 아마 내 추측이 맞는 것 같다.

어쨌든 문제 조건을 고려하면서 정렬 상 최대한 작게하려면 0은 뒤에서부터 없애고, 1은 앞에서부터 없애면 되는 식으로 구현하면 되었다. 나는 입력값을 통쨰로 character 배열에 넣고, 각각 0과 1의 갯수를 카운트한 뒤 2로 나눈 후 앞/뒤부터 세면서 없애는 방식을 사용했다. 이 때 null값을 이용하기 위해 '\0' 방식을 사용했다.


문제 및 입출력


코드

import java.util.Scanner;

public class Main
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int[] num = new int[2];
        char[] input = sc.nextLine().toCharArray();
        int zero = 0;
        int one = 0;
        int cnt = 0;
        
        for(int i=0; i<input.length; i++)
        {
            if(input[i]=='0')
            {
             zero++;
            }
            else if(input[i]=='1')
            {
             one++;
            }
        }
        
        zero /= 2;
        one /= 2;
        
        for(int i=0; i<input.length; i++)
        {
           if(cnt==one)
           {
             break;
           }
           if(input[i]=='1')
           {
             input[i] = '\0';
             cnt++;
           }
        }
        
        cnt = 0;
        
        for(int i=input.length-1; i>=0; i--)
        {
           if(cnt==zero)
           {
             break;
           }
           if(input[i]=='0')
           {
              input[i] = '\0';
              cnt++;
           }
        }
        
        for(int i=0; i<input.length; i++)
        {
           if(input[i]!='\0')
           {
              System.out.print(input[i]); 
           }
        }
        
        sc.close();
        return;
    }
}

반응형

댓글