본문 바로가기
프로그래머스/Python

[프로그래머스] 이진 변환 반복하기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 7. 4.
728x90
반응형

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 설명

2. 풀이과정

  1. 입력받은 문자열을 리스트로 변환한다. s = list(s)
  2. 전체 이진 변환 횟수를 저장해 줄 변수를 생성하고 초기화한다. count = 0
  3. 변환 과정에서 제거된 모든 0의 개수를 저장해 줄 변수를 생성하고 초기화한다. countZero = 0
  4. 원하는 시점에서 멈추기 위해 무한 반복문을 사용한다. while (True)
  5. 현재 변환 과정에서 제거된 0의 개수를 저장해 줄 변수를 생성하고 초기화한다. zero = 0
  6. 문자열 리스트의 원소를 하나씩 추출한다. for i in s
  7. 만약 추출한 원소가 0이면 0의 개수를 1 증가시킨다. if (1 == '0'): zero += 1
  8. 변환 후 문자열 길이를 저장해 줄 변수를 생성하고 현재 문자열 리스트 길이에서 현재 문자열 리스트에 있는 0의 개수를 빼주고 그 값을 대입한다. Len = len(s) - zero
  9. 변환 전 문자열 리스트를 초기화해 준다. s.clear()
  10. 문자열 길이의 값이 0이 될 때까지 반복하여 2진수로 변환한다. while (Len != 0)
  11. 문자열 길이를 2로 나눈 나머지를 문자열 형태로 추가한다. s.append(str(Len % 2))
  12. 문자열 길이를 2로 나눈 몫을 새로 저장한다. Len //= 2
  13. 새로운 문자열 리스트의 원소를 역순으로 바꿔준다. s.reverse()
  14. 변환 과정이 수행되었으므로 횟수를 1 증가시킨다. count += 1
  15. 변환 과정에서 제거된 0의 개수도 더해준다. countZero += zero
  16. 만약 새로운 문자열 리스트의 원소 개수가 1이고, 그 원소가 1이면 종료한다. if (len(s) == 1) and (s[0] == '1'): break
  17. 변환 과정을 정답 배열에 추가하고 answer.append(count)
  18. 변환 과정에서 제거된 모든 0의 개수도 정답 배열에 추가한다. answer.append(countZero)
반응형

3. 소스코드

def solution(s):
    answer = []
    
    s = list(s)
    count = 0
    countZero = 0
    while (True):
        zero = 0
        for i in s:
            if (i == '0'):
                zero += 1
            
        Len = len(s) - zero

        s.clear()
        while (Len != 0):
            s.append(str(Len % 2))
            Len //= 2
        
        s.reverse()

        count += 1
        countZero += zero

        if (len(s) == 1) and (s[0] == '1'):
            break

    answer.append(count)
    answer.append(countZero)

    return answer
728x90
반응형