백준

[문자열/백준] 20310번 : 타노스

ydin 2023. 6. 14. 14:06

- 문제 : https://www.acmicpc.net/problem/20310

 

문제 이해 

- 0과 1로만 이루어져있고, 각 숫자가 모두 짝수개만 존재하는 문자열 하나가 주어진다.

 

- 각 숫자를 절반 개수만큼 지웠을 때 가장 작은 숫자를 출력하는 문제다. 

 

- 처음에는 0 절반 + 1 절반 붙여서 출력하면 되지 않나?라고 생각했지만, 주어진 문자의 순서를 모두 지켜야 했다. 그래서 생각한 방법이 숫자가 가장 작아지려면 0이 최대한 앞에 있어야하고, 1은 최대한 뒤에 있어야 한다는 것이었다. 

 

- 그래서 주어진 단어를 왼쪽에서부터 진행하면서 0의 경우는 전체 0의 개수의 절반만큼 0을 왼쪽부터 찾고, 1의 경우는 전체 1의 개수의 절반만큼을 왼쪽에서 지운 뒤 나머지 절반을 뒤에 남기는 것이었다. 

 

풀이 로직 

- 숫자를 리스트로 변형한 뒤 전체 0의 개수의 절반을 zero, 전체 1의 개수의 절반을 one에 저장한다.

- number에서 가장 왼쪽 수를 pop한다.

- 숫자가 1인 경우는 one의 값이 0이하일 때만 answer에 추가하고, 아직 없애야할 1의 개수가 남아있는 경우(one > 0)에는 one -= 1만 한다. 

- 숫자가 0인 경우는 zero > 0 일 때만 answer에 추가하고, 아니라면 넘어간다. 

- 이렇게 만든 answer의 원소들을 하나의 문자열로 출력한다. 

 

 

정답 풀이 

number = list(input())

zero = number.count('0') // 2
one = number.count('1') // 2

answer = []
while number:
    x = number.pop(0)
    
    if x == '1':
        if one <= 0 :
            answer.append(x)
        else:
            one -= 1
    else:
        if zero > 0:
            answer.append(x)
            zero -= 1
            
print(''.join(answer))