[Algorithms] 문자열 뒤집기 Review

최현진·2022년 2월 28일
0
s = input()
# count = 0
allzero, allone = 0, 0

def solution(s):    
    # global count
    global allzero, allone
    
    # for i in range(0, len(s) - 1):
        # if s[i] != s[i+1]:
            # k = i + 1
            # for j in range(k, len(s) - 1):
                # if s[j] != s[j+1]:
                    # m = j + 1
                    # before = s[k:m]
                    # after = s[k-2] * len(before)                
                    # s = s.replace(before, after)
                    # TypeError: 'str' object does not support item assignment
                    # count += 1
    # return print(count)
    
    if s[0] == 0:
        allone += 1
    else:
        allzero += 1

    for i in range(0, len(s) - 1):
        if s[i] != s[i + 1]:
            if s[i + 1] == 1: 
                allzore += 1
            else:
                allone += 1
    return print(min(allzero, allone))

solution(s)

🐥 HYUNJIN's PICK 시사점


1. 해법

해법으로 문자열을 순차적으로 확인하며 앞과 뒤가 다른 구간마다 앞의 문자열로 해당 구간을 변경하는 방법을 사용하려했다. 순차적으로 돌기때문에 count 변수가 1개 필요했고, 문자열을 그대로 써 인덱싱과 슬라이싱, replace 메서드를 사용하려했다. 하지만, 예제는 원하는 답이 나왔으나 그 외의 문자열을 테스트했을 때 원치않는 답이 출력됐고 구간마다 print를 넣어 출력해보니 아예 잘못된 로직임을 깨닳았다. 특히 로직을 작성한 나 조차도 2중 for문의 흐름을 따라갈 수 없었다.

모든 수가 0이 될 때와 1이 될 때로 count 변수를 2가지로 센 후, 문제에서 원하는 최소값을 선택해 출력하는 아이디어를 제시한 예시를 보았다. 컴퓨팅 사고를 해야하는데 무작정 휴리스틱 알고리즘을 내세운 오류다.


2. 첫문자 검열

문자열 전체를 0으로 할 것인지, 1로 할 것인지로 기준을 잡았다면 첫 문자열이 무엇인지부터 카운트해야할 것이다. 그 이후부터는 for문을 통해 앞과 뒤가 다른 문자열일 때 뒤의 문자열의 값에 따라 0 또는 1 카운트를 올리면 된다.


3. 연속된 하나 이상의 숫자 모두 뒤집기

앞 서 말했듯 문제풀이에 타인의 아이디어인 전체0 또는 1만들기 중 최소값 가져오기를 사용했고 여기엔 for문이 들어간다. 그 전에 나는 2중 for문 오류를 범했다. 그리고 반복적으로 내가 이해하지 못하는 부분은 앞과 다른 연속적인 뒷 문자들을 묶는 방법이다. 앞 뒤가 다른 문자열을 다루는 방법을 확인하려고 print(s[i], s[i + 1])를 사용해 확인하니, for문으로 정확하게 앞과 뒤가 달라지는 구간이 출력되는 것을 확인했다. 그리고 뒤의 문자의 종류에 따라 그에 맞는 count가 올라가는 것을 확인했다. 즉, s[i + 1]인 뒷 문자를 기준으로 count하기 때문에 연속적인 숫자들을 한 덩어리로 잡을 수 있는 것이다.

profile
유연하고 의연하게, 꾸준히

0개의 댓글