폴더 분리
This commit is contained in:
61
workbook_8708/silver/20310-s3.py
Normal file
61
workbook_8708/silver/20310-s3.py
Normal file
@@ -0,0 +1,61 @@
|
||||
# 타노스
|
||||
|
||||
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로 만들었다.
|
||||
"""
|
||||
Reference in New Issue
Block a user