https://school.programmers.co.kr/learn/courses/30/lessons/12911
주어진 n 과 n 보다 큰 다음 수의 이진수로 바꾸고 1의 개수가 똑같으면 되는거다!
조건이 잘 정리되어 있어 읽기 편한? 문제였다
import Foundation
func solution(_ n:Int) -> Int
{
let binaryN = String(n, radix: 2)
let nCount1 = binaryN.filter { $0 == "1" }.count
var nextNum = n
var nextCount1 = 0
while nCount1 != nextCount1 {
nextNum += 1
nextCount1 = String(nextNum, radix: 2).filter { $0 == "1" }.count
}
return nextNum
}
변수를 줄일 수도 있지만 딱 봐도 이해하기 쉽게 변수를 여러개 두었다
이진수를 바꾸는 방법 중 제일 쉬운건 String 으로 변환할 때 radix 파라미터에 2라는 수를 넣으면 된다!
그렇게 이진수로 바꾸고 Filter 고차함수를 이용해 1의 개수를 구하고 두 수의 이진수에 있는 1의 개수가 같을 때 까지 반복하도록 했다
왜그런진 모르겠지만 처음에 효율성 테스트 4 가 시간 초과가 났다!
더 이상 줄일 수 없을거 같은데...? 생각을 하고.. 뭔가 수학적인 공식이 필요한가 싶었지만 다시 실행을 해보니 아주 깔끔히 통과 했다..
정말 이해할 수가 없다....
문제를 다 풀고 다른 사람 풀이를 보니 아주~~ 새로운 메서드가 눈에 띄었다!
var nonzeroBitCount: Int { get }
nonzeroBitCount
프로퍼티는 Int 타입으로 이진 표현에서 1의 비트 수를 출력해주는 것이다!
진짜 수 많은 메서드와 프로퍼티를 봤지만 이건 대박이다..
import Foundation
func solution(_ n:Int) -> Int {
var nextN = n + 1
while true {
if n.nonzeroBitCount == nextN.nonzeroBitCount {
break;
}
nextN += 1
}
return nextN
}
첫번째 풀이보다 훨씬 짧아진 코드를 볼 수 있었다
그리고 확연히 줄어든 걸린시간!
코테 문제를 풀다보면 고차함수를 쓴 것보다 반복문을 통해 푼 것이 더 짧게 걸린 경우가 많았는데
이번의 경우는 드라마틱한 효과를 볼 수 있었다!
물론 다양한 기능을 제공하는 메서드와 프로퍼티를... 다 기억한다는 것은 불가능한 일이고 같은 기능을 하는 코드를 만들어내는 능력 자체가 더욱 중요한거 같다!