[프로그래머스 / Swift] Lv.2 - 다음 큰 숫자 (nonzeroBitCount)

박준혁 - Niro·2024년 3월 7일
1

프로그래머스

목록 보기
4/12
post-thumbnail

🔗 문제 링크


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 가 시간 초과가 났다!

더 이상 줄일 수 없을거 같은데...? 생각을 하고.. 뭔가 수학적인 공식이 필요한가 싶었지만 다시 실행을 해보니 아주 깔끔히 통과 했다..

정말 이해할 수가 없다....


⌨️ 두번째 풀이

문제를 다 풀고 다른 사람 풀이를 보니 아주~~ 새로운 메서드가 눈에 띄었다!

nonzeroBitCount

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
}

첫번째 풀이보다 훨씬 짧아진 코드를 볼 수 있었다
그리고 확연히 줄어든 걸린시간!

코테 문제를 풀다보면 고차함수를 쓴 것보다 반복문을 통해 푼 것이 더 짧게 걸린 경우가 많았는데

이번의 경우는 드라마틱한 효과를 볼 수 있었다!

물론 다양한 기능을 제공하는 메서드와 프로퍼티를... 다 기억한다는 것은 불가능한 일이고 같은 기능을 하는 코드를 만들어내는 능력 자체가 더욱 중요한거 같다!

profile
📱iOS Developer, 🍎 Apple Developer Academy @ POSTECH 1st, 💻 DO SOPT 33th iOS Part

0개의 댓글