Algorithm
[프로그래머스] 다음 큰 숫자
쑤야.
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
}