[프로그래머스] 이진 변환 반복하기 - 파이썬

Donghyun·2024년 8월 8일
0

Code Kata - 파이썬

목록 보기
35/54
post-thumbnail

링크: https://school.programmers.co.kr/learn/courses/30/lessons/70129

문제 설명

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'이 최소 하나 이상 포함되어 있습니다.

입출력 예

sresult
"110010101001"[3,8]
"01110"[3,3]
"1111111"[4,1]

입출력 예 설명

입출력 예 #1

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

입출력 예 #2

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

입출력 예 #3

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

문제풀이

문제 이해하기:

문자열 s 가 주어질 때, x에 대한 이진 변환 방법은:

  1. x의 모든 0을 제거
  2. x의 길이 c를 2진법으로 표현한 문자열로 업데이트

목표: 문자열 s 가 1 이 될 때까지 이진변환을 했을 때 이진변환 횟수와 제거한 0의 개수를 리스트로 return

내 풀이:

  • 변환 횟수와 제거되는 0의 개수를 셀 transform_count, zero_count 변수를 만들고
  • while 문을 사용해 s 가 ‘1’이 될 때까지
    • ‘0’의 개수를 세서 zero_count에 더한 다음
    • s 에서 ‘0’을 없앤다.
    • 그리고 s 의 길이를 이진변환
      • 이 때 ‘0b’라는접두사가 붙으므로 인덱스 슬라이싱 [2:] 를 사용해 그 뒤의 문자열만 가져감
  • 마지막으로 [transform_count, zero_count] return

최종코드

def solution(s):
    transform_count = 0  # 변환 횟수
    zero_count = 0  # 변환 과정에서 제거되는 0의 갯수
    
    # s 가 '1'이 될 때까지 
    while s != '1':
        zero_count += s.count('0')  # '0'의 갯수를 세서 zero_count에 더하고
        s = s.replace('0', '')  # 모든 '0'을 제거한 후
        s = bin(len(s))[2:]  # 이진수의 형태로 변환하면 0b접두사와 함께 반환되기에 그 뒤의 문자열만 가져간다
        
        transform_count += 1  # while 문을 한 번 돌면 transform_count 1회 올리기
    
    return [transform_count, zero_count]
profile
데이터분석 공부 일기~!

0개의 댓글