본문 바로가기

알고리즘

프로그래머스: 이진 변환 반복하기

[level 2] 이진 변환 반복하기 - 70129

문제 링크

성능 요약

메모리: 10.4 MB, 시간: 1.52 ms

구분

코딩테스트 연습 > 월간 코드 챌린지 시즌1

채점결과

정확성: 100.0
합계: 100.0 / 100.0

제출 일자

2024년 1월 6일 2:59:58

문제 설명

0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.

  1. x의 모든 0을 제거합니다.
  2. x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.

예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.

0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.


제한사항
  • s의 길이는 1 이상 150,000 이하입니다.
  • s에는 '1'이 최소 하나 이상 포함되어 있습니다.

입출력 예
s result
"110010101001" [3,8]
"01110" [3,3]
"1111111" [4,1]

입출력 예 설명

입출력 예 #1

  • "110010101001"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 이진 변환 이전 제거할 0의 개수 0 제거 후 길이 이진 변환 결과
1 "110010101001" 6 6 "110"
2 "110" 1 2 "10"
3 "10" 1 1 "1"
  • 3번의 이진 변환을 하는 동안 8개의 0을 제거했으므로, [3,8]을 return 해야 합니다.

입출력 예 #2

  • "01110"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 이진 변환 이전 제거할 0의 개수 0 제거 후 길이 이진 변환 결과
1 "01110" 2 3 "11"
2 "11" 0 2 "10"
3 "10" 1 1 "1"
  • 3번의 이진 변환을 하는 동안 3개의 0을 제거했으므로, [3,3]을 return 해야 합니다.

입출력 예 #3

  • "1111111"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 이진 변환 이전 제거할 0의 개수 0 제거 후 길이 이진 변환 결과
1 "1111111" 0 7 "111"
2 "111" 0 3 "11"
3 "11" 0 2 "10"
4 "10" 1 1 "1"
  • 4번의 이진 변환을 하는 동안 1개의 0을 제거했으므로, [4,1]을 return 해야 합니다.

풀이

def solution(s):
    answer = [0, 0]

    while len(s) > 1:
        new_s = ''
        count = s.count('0')
        answer[0] += 1
        answer[1] += count
        s = s.replace('0', '')
        length = len(s)
        while length >= 1:
            r = length % 2
            length = length // 2
            new_s += str(r)

        s = new_s[::-1]

    return answer

느낀점

개인적으로 느끼기에 이번 문제에 대한 핵심은 주어진 숫자를 줄이고 난 뒤에, 이진변환을 어떻게 할지가 중요하다고 생각된다. 나의 경우에는 while을 두 번 사용해서 문제를 풀었다. 이전에 적은 글에서 이진변환을 bin()내장함수로 해보자는 기억이 났는데 막상 실천하지 못했다. 이진 변환은 어떤 수를 2로 나눴을 때 나머지를 기록하고 제일 밑단부터 위쪽까지 올려쓰면 된다. 그래서 나의 경우에는 위에서부터 밑까지 수를 저장하고 while이 끝나면 해당 문자열을 뒤집었다.

이전에 이와 비슷한 문제를 접해서 그런지 몰라도 생각보다 크게 어렵지 않았다. 아직까지는 정답률이 70% 근처인 문제여서 그런것 같다는 생각이 들기도 한다...

출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges