백준 1439번 뒤집기 python

hyewon9913·2023년 12월 26일

코딩테스트(python)

목록 보기
10/46
s = input()

i = 0
before = s[0]
cnt_0 = 0
cnt_1 = 0
ans = 0
while i < len(s):
    ##0으로 연속된 숫자들의 개수
    if s[i] == "0":
        while i+1 < len(s) and s[i+1] == "0":
            i+=1
        #마지막에 한번 더 더해지는 것 방지
        if i != len(s):
            cnt_0+=1
        i+=1
    ##1으로 연속된 숫자들의 개수
    elif s[i] == "1":
        while i+1 < len(s) and s[i+1] == "1":
            i+=1
         #마지막에 한번 더 더해지는 것 방지
        if i != len(s):
            cnt_1+=1
        i+=1
ans = min(cnt_1,cnt_0)
print(ans)

처음에는

 if i != len(s):
 	cnt_1+=1
 i+=1

이 부분을

 i+=1
 if i != len(s):
 	cnt_1+=1

이런식으로 구현을 해주었더니

1010101010과 같은 예시에서 에러가 발생했다

그 이유는 마지막 숫자가 포함된 부분은 카운트가 되지 않았기 때문이다.

그런데 사실 이 부분은 while 에서 i 가 len(s)보다 작을때에만 돌도록 구현을 해주어도 되었다.
따라서 이후에 수정을 해주어

s = input()

i = 0
before = s[0]
cnt_0 = 0
cnt_1 = 0
ans = 0
while i < len(s):
    ##0으로 연속된 숫자들의 개수
    if s[i] == "0":
        while i+1 < len(s) and s[i+1] == "0":
            i+=1

        cnt_0+=1
        i+=1
    ##1으로 연속된 숫자들의 개수
    elif s[i] == "1":
        while i+1 < len(s) and s[i+1] == "1":
            i+=1
        cnt_1+=1
        i+=1
ans = min(cnt_1,cnt_0)
print(ans)

이렇게 조금 더 간단하게 코드를 수정해주었다.

전체적인 해결방식은 0으로 연속된 숫자들의 개수, 1로 연속된 숫자들의 개수를 각각 구한 후 그중 최솟값을 정답으로 지정하는 방식이다.

왜냐하면 연속된 숫자가 적은 쪽을 뒤집어주면 되기때문이다.

profile
차근차근 굴러가는 코딩일지

0개의 댓글