코딩 테스트/Level 2

21. 다음 큰 숫자

컴닥 2020. 8. 4. 14:56
반응형

https://programmers.co.kr/learn/courses/30/lessons/12911

연습문제 4563명 완료

 

코딩테스트 연습 - 다음 큰 숫자

자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다. 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다. 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니

programmers.co.kr

Python

def solution(n):
    n_count = bin(n).count('1')
    n += 1
    while bin(n).count('1') != n_count:
        n += 1
    return n
테스트 1 〉	통과 (0.04ms, 10.7MB)
테스트 2 〉	통과 (0.04ms, 10.7MB)
테스트 3 〉	통과 (0.04ms, 10.7MB)
테스트 4 〉	통과 (0.03ms, 10.7MB)
테스트 5 〉	통과 (0.04ms, 10.7MB)
테스트 6 〉	통과 (0.03ms, 10.7MB)

bin함수와 count 함수를 안다면 어렵지 않을 것 같습니다.
bin 함수는 숫자를 2진수 표기(문자열)로 바꿔줍니다. 
count 함수는 list 등에서 사용할 수 있는 것처럼 문자열에서도 사용할 수 있습니다. 
대부분의 언어에서 문자열은 char array 비스무리하게 처리해 주죠?  
https://wikidocs.net/14#x-count

저의 코드는 아닙니다만, 재귀를 사용하면 한 줄로 줄일 수도 있습니다.
키워드 인수를 이용해서 초기값을 전달하는 쌘쓰
https://dojang.io/mod/page/view.php?id=2346

def solution(n, n_count=0):
    return n if (bin(n).count('1') == n_count) else \
        solution(n+1,  bin(n).count('1') if (n_count is 0) else n_count)
테스트 1 〉	통과 (0.05ms, 10.7MB)
테스트 2 〉	통과 (0.04ms, 10.7MB)
테스트 3 〉	통과 (0.06ms, 10.8MB)
테스트 4 〉	통과 (0.04ms, 10.7MB)
테스트 5 〉	통과 (0.04ms, 10.6MB)
테스트 6 〉	통과 (0.04ms, 10.7MB)

JS

function solution(n) {
	num = n.toString(2).split('').reduce((a, b) => a = parseInt(a) + parseInt(b))
	do {
		n++
	} while (num == n.toString(2).split('').reduce((a, b) => a = parseInt(a) + parseInt(b)))
	return n;
}

C#

using System;
using System.Linq;

internal class Solution
{
    public int solution(int n)
    {
        int temp = Convert.ToString(n, 2).Where(a => a == '1').Count();
        for (n = n + 1;  temp != Convert.ToString(n, 2).Where(a => a == '1').Count(); n ++){}
        return n;
    }
}

Java

class Solution {
    public int solution(int n) {
        int num = Integer.bitCount(n);
        while (num != Integer.bitCount(++n)) {}
        return n;
    }
}
반응형