Files
baekjoon-study/workbook_8708/silver/20310-s3.py
2026-02-23 11:14:50 +09:00

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로 만들었다.
"""