상세 컨텐츠

본문 제목

[프로그래머스] 다음 큰 숫자

Algorithm

by 쑤야. 2023. 12. 11. 13:42

본문

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

 

프로그래머스

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

programmers.co.kr

 

로직 1.


  • 0번째 인덱스가 1이거나, 0이 아예 존재하지 않을 경우 0번째 인덱스에 0 삽입.
  • '01' 이 나타나는 마지막 인덱스를 찾는다.
  • 마지막 '01' 이후에 등장하는 1의 개수를 카운팅한다. 
  • 마지막 '01'을 '10'으로 스와이프해준다.
  • 이후 등장하는 1은 끝자리로 몰아준다.

 

코드


def solution(n):
    
    binary = list(format(n, 'b'))
    
    if '0' not in binary or binary[0] == "1": 
        binary.insert(0, "0")

    swipe_idx = 0
    remain_one = -1
    for i in range(0, len(binary)):
        if i < len(binary)-1 and binary[i] == '0' and binary[i+1] == "1":
            swipe_idx = i
            remain_one = -1
        elif binary[i] == '1':
            remain_one += 1
    
    binary[swipe_idx] = '1'
    binary[swipe_idx+1] = '0'
    
    for i in range(len(binary)-1, swipe_idx+1, -1):
        if remain_one > 0:
            binary[i] = "1"
            remain_one -= 1
        else:
            binary[i] = "0"

 

반례


  • 110 → 1001

 

로직 2.


  • 기준 값으로 부터, 조건을 만족하는 값을 찾을 때까지 1씩 증가시키며 반복문 수행.
func solution(_ n:Int) -> Int{
     var nOneCount = String(n, radix:2).filter{ $0 == "1" }.count
     var value = n+1
     while(true){
         let radix = String(value, radix:2)
         let oneCount = radix.filter{ $0 == "1"}.count
         if(oneCount == nOneCount){
             break
         }
         value += 1
     }
     return value
 }

 

관련글 더보기