61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
# 타노스
|
|
|
|
import sys
|
|
from collections import deque
|
|
|
|
input = sys.stdin.readline
|
|
|
|
def solution():
|
|
s = input().rstrip()
|
|
|
|
s_dict = {"0": [], "1": []}
|
|
len_0 = 0
|
|
len_1 = 0
|
|
|
|
for i in range(len(s)):
|
|
if s[i] == "0":
|
|
s_dict["0"].append(i)
|
|
len_0 += 1
|
|
else:
|
|
s_dict["1"].append(i)
|
|
len_1 += 1
|
|
|
|
len_0 //= 2
|
|
len_1 //= 2
|
|
|
|
s_dict["0"] = deque(s_dict["0"][:len_0])
|
|
s_dict["1"] = deque(s_dict["1"][len_1:])
|
|
|
|
new_s = ""
|
|
|
|
for _ in range(len_0+len_1):
|
|
idx_0 = s_dict["0"][0] if len_0 > 0 else float('inf')
|
|
idx_1 = s_dict["1"][0] if len_1 > 0 else float('inf')
|
|
if idx_0 > idx_1:
|
|
s_dict["1"].popleft()
|
|
len_1 -= 1
|
|
new_s += "1"
|
|
else:
|
|
s_dict["0"].popleft()
|
|
len_0 -= 1
|
|
new_s += "0"
|
|
|
|
|
|
print(new_s)
|
|
|
|
return
|
|
|
|
solution()
|
|
|
|
"""
|
|
걸린 시간: 40분
|
|
|
|
시간 복잡도: s길이만큼 개수를 세고, s길이의 반만큼 재배열을 하기 때문에 O(len(s))이다. 그런데 나처럼 popleft 하면서 하지 않고,
|
|
그냥 두 리스트 합친다음에 sort하면 nlogn이므로 내가 더 낫다.
|
|
|
|
해설: 새로운 문자열 s는 기존 s에서 재배열 하는 것이 아니라 그냥 빼는 것이었다. 문제 설명 개별로네..
|
|
아무튼 그래서 개수를 세고 1은 앞에 있는 것부터 반만큼 지우고, 0은 뒤에 있는 것부터 반만큼 지우면 된다.
|
|
그렇게 하기 위해서 0과 1의 인덱스를 따로 기록해두고 0의 인덱스 리스트는 앞에서부터 반 자르고, 1은 반부터 뒤까지 자른다.
|
|
마지막으로 이 인덱스 리스트 2개를 맨 앞에 것들끼리 비교해서 작은 놈을 popleft 하고, 그에 맞는 숫자(0 또는 1)을 new_s에 추가한다.
|
|
deque는 슬라이스를 지원하지 않아서, 리스트에서 슬라이스하고 popleft 하기 전에 deque로 만들었다.
|
|
""" |