자료구조 및 알고리즘/프로그래머스

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

viamemine 2024. 4. 12. 11:29
728x90
반응형

 

 


 

💬 내가 작성한 python 코드

def solution(s):
    answer = []
    
    cnt=0; zero_cnt = 0
    while int(s,2) > 1: # 문자열은 int(문자열, n진수)로 변환하여 연산할 수 있다
        cnt += 1
        
        zero_cnt += s.count('0') # 누적된 zero 갯수 세기 위함
        one_cnt = s.count('1')
        s.replace('0', '')
               
        binary_str = ""; 
        # one_cnt를 2진법으로 바꿔서 s 업데이트
        while one_cnt != 0: 
            binary_str = str(one_cnt % 2) + binary_str
            one_cnt = one_cnt // 2
        s = binary_str
        
        answer = [cnt, zero_cnt]
    return answer

 


 

💬 다른 사람이 작성한 코드

def solution(s):
    a, b = 0, 0 
    while s != '1': # string이 1이 될 때까지 반복
        a += 1 # a는 변환 횟수 cnt를 위함
        num = s.count('1')
        b += len(s) - num # 전체 길이에서 1의 갯수를 빼면 0의 갯수를 도출할 수 있음
        s = bin(num)[2:] # bin(): int 값을 이진수 문자열로 변환시켜줌 -> ex) 0b1010 
    return [a, b]

 

 


 

TIL(Today I Learned) ... 

 

가장 먼저, python에서 제공하는 method를 잘 활용할 줄 알아야겠다는 생각을 했다.

 

처음 코드를 작성하고 채점해보았을 때 '시간초과'가 떴다 ...

시간 복잡도와 공간 복잡도를 줄이기 위한 코드 작성을 위해서는

python에서 제공하는 method를 적재적소에 활용할 줄 알아야 한다는 깨달음을 얻었다.

 

새롭게 int 값을 이진수 문자열로 변환시켜주는 bin()을 알았다.
나는 while문으로 이진수 변환을 처리했지만, bin()을 활용하면 한 줄로 작성할 수 있다. 

 

bin()은 0b1010 이런식으로 return되기 때문에, 세번째 인덱스부터([2]) 이진수로의 변환 값을 얻을 수 있다.

 

또한 int(s,2)을 새로 배웠다. 문자열은 int(문자열, n진수)로 변환하여 연산할 수 있다.

 

 

 

 

 

728x90