- 문제 : 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))
'백준' 카테고리의 다른 글
[백준/브루트포스] 1018번 : 체스판 다시 칠하기 (2) | 2024.02.11 |
---|---|
[백준/다익스트라] 4485번 : 녹색 옷 입은 애가 젤다지? (0) | 2024.02.06 |
[문자열/백준] 1515번 : 수 이어 쓰기 (0) | 2023.06.12 |
[누적합/백준] 2167번 : 2차원 배열의 합 (0) | 2023.05.09 |
[누적합/백준] 2015번 : 수들의 합 4 (0) | 2023.05.09 |