알고리즘/프로그래머스

[프로그래머스] 월간 코드 챌린지 시즌1 - 이진 변환 반복하기 (Lv2)

gyu-won 2024. 12. 3. 03:50

나와 같은 오리가 존재한다

반가운 첫 인사 (건너뛰기 가능)

안녕하세요 반갑습니다. 티스토리 포스팅으로 처음 인사드립니다. (뭐 사실 인사드릴 사람은 없지만 말입니다.)

티스토리를 하기 이전에, 사실 벨로깅을 하고 있는 상태였습니다. (벨로깅 마저 꾸준히 하지 못한...) 

티스토리가 벨로그 보다 훨씬 더 좋은 기능들을 제공하고 있다는 것을 미리 알고 있었지만, 전부터 벨로그를 계속 사용해왔고, 그닥 불편한 점을 느끼지 못해서,,, 티스토리는 가입만 해두고 사용하지 않는 상태였습니다.

그러다가,,, 주변에서는 티스토리를 더 많이 사용하기도 했고, 최근들어 같이 출근하는 친한 동료가 티스토리 1일 1포스팅을 하면서 불태우고 있길래 나도 미루었던 블로깅을 하고자 티스토리를 시작하게 되었습니다...!!

 

사실 전, 무언가를 기록하는 것과는 거리가 매우 먼 사람입니다. 너무 귀찮고 힘들더라구요....나쁜습관이죠. (공부를 잘할래야 잘 할 수 가 없ㄴ.....ㅁㅇㅁㄴㄹ) 하지만 최근 학교친구들과 인턴과 각종 프로젝트를 진행 하면서 크게 깨달은 것이 있습니다..! 그것은 바로 문서화..! 개발자는 개발이 다가 아닙니다. 본격적인 개발에 들어가기 전에 erd, api 명세서, 기획 제안서, 와이어프레임, I.A, 기능 정의 등 작성해야 할 문서가 너무너무너무너무 많습니다. 지금이라도, 기록하고 정리하는 습관을 가져서 이러한 고난길에서 벗어나고자 합니다. 열심히 하겠습니다 이쁘게 봐주세요! (이쁘게 봐줄사람도 없지만 말입니다)

 

그럼 산뜻하게 첫 포스팅을 알고리즘으로 스타트를 끊어보도록 하겠습니닷..!

 

 


 

문제 접근

각설하고, 문제접근으로 넘어가보도록 하겠습니다. 문제링크는 하단에 걸어두도록 하겠습니다..!

Lv2 문제치고는 생각보다 쉬웠던 것 같습니다. 처음 문제를 보고 든 생각은 기능을 함수 단위로 나누자 입니다..!

  1. 0을 제거한 후의 이진수 길이를 구하는 함수(숫자 1만 카운트한 값을 리턴)
  2. 1번의 값을 이진수로 변환한다.
  3. 1번과 2번을 반복한다. (이진수가 "1" 이 될때까지, 반복을 진행하고, 이진수로 변환한 횟수와 제거한 0의 개수를 리턴)
  • 0을 제거한 후의 이진수 길이를 구하는 함수는 아래와 같다.
#0 제거 후 길이 반환
def removeZero(binary):
    countOne=0
    for i in binary:
        if(i=="1"):
            countOne+=1
    
    return countOne

 

 

  • 숫자를 이진수로 변환하는 로직은, 2로 나눈 나머지 값을 순차적으로 맨 뒤에 배치하고, 몫이 1이 되는 경우 반복문에서 탈출하여 1을 붙여주는 방식으로 구현하였다.
#이진 변환 결과
def changeToBinary(countOne):
    num = "" 
    while countOne!=1:
        num = str(countOne%2)+num
        countOne=countOne//2
    num = "1"+num
    
    return num

 

문제 리뷰

코드 주요 부분 : 0을 제거한 후의 길이를 구하고 이를 이진수로 변환하는 로직 => 이러한 과정을 반복문으로 처리.

각 기능들을 함수단위로 나누고, solution 함수에서 이진수 변환 횟수와 0을 제거한 횟수를 카운트하여 리턴해준다.

걸린 시간 : 30분 

체감 난이도 : 내가 아는 프로그래머스 Lv2에 비하면 쉬운 수준 이었다.

 

전체 코드

def solution(s):
    countBinaryChange = 0 # 이진 변환 횟수
    countRemoveZero = 0 # 제거할 0의 개수
    result=s # 이진 변환 결과
    answer = []
    
    # 1. 0 제거 후 길이 구하기
    # 2. 1번의 이진변환 진행
    # 3. 위 1,2번을 이진 변환결과가 "1"이 될때 까지 반복
    while result!='1':
        countRemoveZero += countZero(result)
        result = changeToBinary(removeZero(result))
        countBinaryChange+=1
       
    answer.append(countBinaryChange)
    answer.append(countRemoveZero)
    return answer

#0 제거 후 길이 반환
def removeZero(binary):
    countOne=0
    for i in binary:
        if(i=="1"):
            countOne+=1
    
    return countOne

#제거할 0의 개수 파악(총 0의 개수)
def countZero(binary):
    count=0
    for i in binary:
        if(i=="0"):
            count+=1
            
    return count

#이진 변환 결과
def changeToBinary(countOne):
    num = "" 
    while countOne!=1:
        num = str(countOne%2)+num
        countOne=countOne//2
    num = "1"+num
    
    return num

 

문제 링크

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

마무리

마무리 하면서,,, 자바로 코테를 준비하다가 파이썬으로 갈아타니 얼마나 편한지..! 왜 굳이 자바를 고집해가지구,,,,,
쨋든 티스토리 포스팅 재밌구만...! (진실입니다 하하하)
앞으로도 새롭게 배우고 깨달은 것들을 기록하면서 꾸준히 성장하는 개발자가 되도록 노력하겠습니다..!

 

 
HOME SWEET HOME (feat. 태양, 대성)
아티스트
G-DRAGON
앨범
HOME SWEET HOME (feat. 태양, 대성)
발매일
2024.11.22