본문 바로가기

Algorithm & SQL/Programmers

[Algorithm] [Python/Swift] Programmers - 다음 큰 숫자

Programmers - 다음 큰 숫자

 

문제 설명


자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다.

 

  • 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다.
  • 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다.
  • 조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다.
    예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다.

자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요.

 

제한 사항


  • n은 1,000,000 이하의 자연수 입니다.

 

입출력 예


image

제출 코드


Python

def solution(n):
    OneCount = bin(n).count('1')
    while True:
        answer += 1
        if OneCount == bin(n).count('1'):
            return answer

 

Swift

import Foundation

func solution(_ n: Int) -> Int {
    var answer = n
    var oneCount = 0
    let number = String(n, radix: 2)                // 2진수로 변환

    for item in number {                            // 1의 개수 카운팅
        if item == "1" {
            oneCount += 1
        }
    }

    while true {                                    // 조건에 맞는 정수 구하기
        var count = 0
        answer += 1

        for item in String(answer, radix: 2) {
            if item == "1" {
                count += 1
            }
        }

        if count == oneCount {
                return answer
        }
    }

 

문제 풀이


처음에는 문제를 너무 어렵게 생각했다.

 

주어진 정수값을 2진수로 변경하여 1의 어떻게 조합시켜야 할 지 고민했다. 물론 그렇게도 푸는것은 가능할 것 같지만 생각해야 할 예외사항이 너무 많았다.

 

보다 효율적인 방법을 생각하던중, 2진수의 값을 만들고 10진수로 변환하는 것이 아니라 10진수의 값을 2진수로 변환하여 비교하는 방법이 훨씬 효율적일 것 이라는 생각이 들었다.

 

아래 흐름대로 문제를 풀었다.

  1. 주어진 10진수의 값(n) 을 2진수로 변환하여 1의 개수를 파악한다.

  2. while문을 통해 answer값을 1씩 증가시키며 n보다 크며 2진수 변환시 1의 갯수가 n과 동일한 정수를 찾는다.

 

배운 점


아직 파이썬 풀이도 부족하지만 스위프트는 정말 너무 부족하다.

 

Swift

    let number = String(n).map({Int(String($0))!})        // 문자 배열을 정수 배열로 변환! map(Int(String($0))!)