문제링크
0과 1로만 구성된 문자열을 입력받는다.
이어진 문자열을 뒤집을 수 있는 행동을 통해 한가지로만 구성된 문자열을 만들고 싶다.
이 경우 최소한으로 행동을 하려면 몇번인가?
0과 1의 범위가 변환될 때 마다 숫자를 세어준다.
data = input()
# 최근의 것
last = int(data[0])
# 범위의 개수
cnt = [0, 0]
for d in data[1:]:
i = int(d)
if i != last:
cnt[last] += 1
last = i
# 마지막 범위 추가
cnt[last] += 1
zero, first = cnt
print(min(zero, first))
답안
data = input()
count0 = 0 # 전부 0으로 바꾸는 경우
count1 = 0 # 전부 1으로 바꾸는 경우
# 첫번째 원소에 대해서 처리
if data[0] == '1':
count0 += 1
else :
count1 += 1
# 두 번쨰 원소부터 모든 원소를 확인하며
for i in range(len(data) - 1):
if data[i] != data[i+1]:
# 다음 수에서 1로 바뀌는 경우
if data[i + 1] == '1':
count0 += 1
# 다음 수에서 0으로 바뀌는 경우
else:
count1 += 1
print(min(count0, count1))
전형적인 그리디 방법으로 풀 수 있다. 많은 부분에 적용되지만, 판단유무를 가리는게 마냥 쉬운 알고리즘은 아니므로 유의하자!