[ Programmers / CodingTest / Python ] 이진 변환 반복하기

황승환·2022년 1월 22일
0

Python

목록 보기
115/498

문제 설명

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 해야 합니다.

접근 방법

문제에서 주어진대로 구현을 하면 된다. 우선 while문을 통해 s를 변화시키면서 매 반복마다 변환 횟수를 1씩 증가시켜주고 s에 존재하는 1의 갯수를 따로 저장한 뒤에, 없앤 0의 갯수를 s의 길이-1의 갯수만큼 증가시킨다. s를 1*(1의 갯수)로 갱신하고 다시 s를 이진수로 나타낸뒤에 앞에 붙은 b0을 제거하기 위해 슬라이싱을 사용해 [2:]만큼만 s에 저장하도록 한다. 이 과정을 반복하다가 s가 1이 되면 반복을 멈춘다.

파이썬 내장함수 중에 bin()을 사용하면 인자로 들어간 수를 이진법으로 표현해준다. 물론 문자열로 표현한다. 만약 bin(4)를 출력하면 b0100과 같은 형식으로 출력된다. 앞에 b0이 붙어 이진법임을 표시하는 것이다. 이 문제에서 bin()함수를 사용하기 위해서는 앞에 붙은 b0을 제거하고 사용해야 하므로 문자열 슬라이싱을 사용해야 한다.

  • 정답을 저장하는 배열 answer를 선언한다.
  • 변환 횟수를 셀 변수 b_cnt를 0으로 선언한다.
  • 제거한 0의 갯수를 셀 변수 z_cnt를 0으로 선언한다.
  • s가 1이 아닐동안 반복하는 while문을 돌린다.
    -> b_cnt를 1 증가시킨다.
    -> s에 존재하는 1의 갯수를 세어 임시 변수 one에 저장한다.
    -> z_cnt에 s의 길이 - one을 더해준다.
    -> s를 one개의 1로 갱신한다.
    -> s의 길이를 이진법으로 나타낸 값에 앞부분(b0)을 제거한 문자열을 s에 저장한다.
  • answer에 b_cnt를 넣는다.
  • answer에 z_cnt를 넣는다.
  • answer를 반환한다.

solution.py

def solution(s):
    answer = []
    b_cnt=0
    z_cnt=0
    while s!='1':
        b_cnt+=1
        one=s.count('1')
        z_cnt+=len(s)-one
        s='1'*one
        s=bin(len(s))[2:]
    answer.append(b_cnt)
    answer.append(z_cnt)
    return answer

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글