이 문제는 연속된 0, 연속된 1의 덩어리가 몇개인지 각각 세어서
더 적은 것으로 뒤집으면 최소로 뒤집을 수 있다.
예제로 주어진 0001100
을 가지고 split()
함수를 돌리면 각각
`0001100`.split('1') # ['000', '', '00']
`0001100`.split('0') # ['', '', '', '11', '', '']
이렇게 되는데, 공백이 있기 때문에 다시 공백을 빼고 세어주고 0과 1중 더 적은것이 최소로 뒤집는 횟수가 된다.
이 풀이가 문제가 의도한 것이 아닐까 싶은데, 이 문제는 0으로 만들기 위해 1이 연속된 문자열을 뒤집거나, 그 반대이다. 그렇기 때문에 0으로 이루어진 문자열 덩어리, 1로 이루어진 문자열 덩어리의 갯수를 세어서 더 적은것을 뒤집으면 최소횟수로 뒤집어 다 같은 문자로 만들 수 있다.
입력받은 string
의 처음을 status
로 설정한다. status = string[0]
그 다음 string의 1번째 부터 for문을 돈다.
i번째의 문자가 status와 같다면, 연속된 문자이기 때문에 continue
i번째의 문자가 status와 다르다면, 연속된 문자가 끝난것. status에 해당하는 문자가 계속되어 왔을 것이므로 status가 0이면 zero_cnt
를 1 증가시키고, 1이면 one_cnt
를 1 증가시킨다.
status를 string[i]로 바꾼다. (string[i]의 연속된 문자열이 시작되므로)
for문을 다 돌면, 마지막 연속된문자열에 대해서는 검사하지 못했으므로, status가 0인지 1인지 판단하여 4번처럼 한다.
zero_cnt
, one_cnt
중 더 작은 값을 return 한다.
def solution(string: str):
zero_frac = string.split('1')
one_frac = string.split('0')
zero_cnt = 0
one_cnt = 0
for s in zero_frac:
if s != '':
zero_cnt += 1
for s in one_frac:
if s != '':
one_cnt += 1
return(min(zero_cnt, one_cnt))
string = input()
print(solution(string))
def solution(string: str):
status = string[0]
zero_cnt = 0
one_cnt = 0
for i in range(1, len(string)):
if status == string[i]:
continue
else:
if status == '0':
zero_cnt += 1
if status == '1':
one_cnt += 1
status = string[i]
if status == '0': zero_cnt += 1
if status == '1': one_cnt += 1
return(min(zero_cnt, one_cnt))
string = input()
print(solution(string))