본문 바로가기

개발/algorithm

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

문제 링크

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

 

코딩테스트 연습 - 이진 변환 반복하기

 

programmers.co.kr

풀이 

- 0을 제거해줄 때 while 문 때문에 시간초과가 발생하였다. 

# 시간 초과 코드 
def solution(s):

    cnt = 0
    zero = 0
    

    while True :
    	# 1이면 중단 
        if s == '1':
            return (cnt, zero)
        
        # 정수형 리스트로 변환 
        t = list(map(int, s))
            
        # 0 제거 
        while True :
            if 0 in t:
                t.remove(0)
                # 제거된 0의 개수 세기 
                zero += 1 
            else:
                break 
        
        # 길이 이진 변환 
        s = bin(len(t))
		# 앞에 0x 제거 
        s = str(s[2:])
        # 변환 횟수 + 1 
        cnt += 1

cnt = 변환 횟수, zero = 제거된 0의 개수 

while 문 반복 

- s가 '1'이면 변환 횟수와 제거된 0의 개수 반환 

 

1. s의 한 글자씩 정수형으로 변환하여 list 생성 : t 

2. 0의 개수 더하기

3. t에서 0 제거 

4. 남은 t의 길이를 이진 변환 

5. 이진 변환 시 앞에 0x가 붙으므로 이를 제거해주고 s 갱신, cnt + 1 

def solution(s):

    cnt = 0
    zero = 0
    

    while True :
    	# 1이면 결과값 리턴 
        if s == '1':
            return (cnt, zero)
        
        # 정수형 리스트로 변환
        t = list(map(int, s))
            
        # 0의 개수 
        zero += t.count(0)
        
        # 0 제거 
        t = [ i for i in t if i not in {0} ]
        
        # 길이 이진수 변환 
        s = bin(len(t))

        s = str(s[2:])
        cnt += 1

생각해보니 1의 개수를 이진 변환하는 것과 같으므로 굳이 t에서 0을 제거해줄 필요가 없다. 

따라서 t에서 1의 개수를 이진 변환 

def solution(s):

    cnt = 0
    zero = 0
    

    while True :
        if s == '1':
            return (cnt, zero)
        
        t = list(map(int, s))
            
        zero += t.count(0)
        
        # 1의 개수 이진수 변환 
        s = bin(t.count(1))
        s = str(s[2:])
        cnt += 1