diff --git a/workbook_8708/20310-s3.py b/workbook_8708/20310-s3.py new file mode 100644 index 0000000..a0a698a --- /dev/null +++ b/workbook_8708/20310-s3.py @@ -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로 만들었다. +""" \ No newline at end of file