[백준] 20310 타노스 - python

이윤진·2023년 8월 19일
0

알고리즘 연습

목록 보기
8/24

백준 20310 타노스 [링크]

문제

어느 날, 타노스는 0과 1로 이루어진 문자열
SS를 보았다. 신기하게도, SS가 포함하는 0의 개수와 SS가 포함하는 1의 개수는 모두 짝수라고 한다.

갑자기 심술이 난 타노스는 SS를 구성하는 문자 중 절반의 0과 절반의 1을 제거하여 새로운 문자열 SS'를 만들고자 한다. SS'로 가능한 문자열 중 사전순으로 가장 빠른 것을 구하시오.

입력

문자열 SS가 주어진다.

출력

SS'로 가능한 문자열 중 사전순으로 가장 빠른 것을 출력한다.

서브태스크 1 (25점) 

SS의 길이는 4의 배수이다.
SS의 홀수 번째 문자는 1, 짝수 번째 문자는 0이다.

서브태스크 2 (75점)

추가적인 제약 조건이 없다.

25점 짜리 코드

처음엔 문제를 잘 이해하지 못하여 문자의 자리 이동이 가능하다고 이해했었다.

# 타노스
import sys

s = sys.stdin.readline().rstrip()

n = s.count('0')
m = s.count('1')

for i in range(n//2):
    print('0', end='')
for j in range(m//2):
    print('1', end='')

정답 코드

이후 숫자의 위치 변경이 되지 않는다는 것을 알고, 앞에서부터 1을 절반 없애고, 뒤에서부터 0을 절반 없애는 방식을 생각하였다.

# 타노스
import sys

s = list(sys.stdin.readline().rstrip())

n = s.count('0')
m = s.count('1')

#앞에서부터 1을 갯수의 절반 만큼 지우고, 뒤에서부터 0을 갯수의 절반 만큼 지우자.
# 리스트를 역순하는 가장 쉬운 방법 [::-1]

check = 0
for i in s:
    if check == m//2:
        break
    if i == '1':
        s.remove(i)
        check += 1

check = 0
s = s[::-1]
for i in s:
    if check == n//2:
        break
    if i == '0':
        s.remove(i)
        check += 1

for i in s[::-1]:
    print(i, end='')

뒤에서 부터 0을 없애기 위해 list를 역순해야했는데 이때 reverse 또는 reversed를 사용하면 type이 바뀌기 때문에 [::1][::-1]을 사용하는 것이 더 바람직하다.

profile
Android/Flutter 개발

0개의 댓글