반응형
안녕하세요. 개발 중인 정주입니다.
오늘은 "프로그래머스(Lv.2) - 2개 이하로 다른 비트" 문제를 풀었습니다.
Github
문제 링크
풀이
이번 문제는 수학 문제입니다.
1. 0으로 끝나는 2진수
2진수가 0으로 끝나는 경우에는 1을 더해주면 됩니다.
1을 더한 수는 모든 비트는 동일하고 마지막 비트만 1이기 때문에 비트 1개가 다릅니다.
2. 1로 끝나는 2진수
1로 끝나는 경우는 가장 마지막의 0을 1로 바꿔주면 됩니다.
101인 경우 111로, 111인 경우 1111이 비트가 1~2개 차이나는 가장 작은 수 입니다.
가장 마지막 0을 1로 바꾼다는 것은 2^n을 더해준다는 의미와 같습니다.
따라서 0의 인덱스가 1이라면 2를 더하고, 0의 인덱스가 4라면 8을 더해주면 됩니다.
후기
10^15 는 처음 봐서 깜짝 놀랐습니다.
반복문은 당연히 안 될 것이라 생각해서 공책에 적어가며 규칙을 찾았는데요.
1로 끝나는 2진수 규칙을 찾는 게 시간이 좀 걸렸네요 ㅠㅠ
화이팅 화이팅
감사합니다!
전체 코드
import Foundation
func solution(_ numbers:[Int64]) -> [Int64] {
var results: [Int64] = []
for number in numbers {
var result: Int64 = 0
var binary1: [String] = Array(String(number, radix: 2)).map { String($0) }
if binary1[binary1.count-1] == "0" { //0으로 끝나면 1만 더해주면 된다.
result = number + 1
} else { //1로 끝나면 첫 번째 0을 1로 바꾸면 된다.
let count = binary1.reversed().firstIndex(of: "0") ?? binary1.count
result = number + Int64(pow(2.0, Double(count)-1))
}
//print("binary1: \(binary1)")
results.append(result)
}
return results
}
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.
반응형