기록공간

다음 큰 숫자 (프로그래머스) 본문

Algorithm/문제

다음 큰 숫자 (프로그래머스)

입코딩 2020. 6. 12. 21:52
반응형

이진수로 변환하는 방법을 알고 있다면 어렵지 않게 풀 수 있는 문제였다. 이진수 변환 방법은 이전 문제를 풀 때 사용했던 방법을 그대로 사용하였다. 자세한 내용은 다음 링크를 참고하자. 

https://lipcoder.tistory.com/entry/%EB%B9%84%EB%B0%80%EC%A7%80%EB%8F%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4?category=843241

 

비밀지도 (프로그래머스)

이진수로 변환하는 방법만 안다면 어렵지 않게 풀 수 있는 문제이다. 이진수 변환에는 쉬프트 연산을 사용하였다. 예를 들어 9를 이진수로 변환한다고 하자. 9의 이진수는 1001이다. (전체 이진수

lipcoder.tistory.com

 

풀이 과정을 설명하기 전에 함수 one_count()를 구현한다. 이 함수는 특정 숫자를 매개변수로 받아 그 숫자의 이진수 값이 가지는 1의 갯수를 반환해준다. 이 문제에서 중요한 것은 이진수에서의 1의 갯수가 서로 같은 것이므로 이진수 값으로 변환할 필요 없이 1의 갯수만 세어주면 된다. 

 

접근 방법은 다음과 같다.

  1. 입력 받은 숫자 n을 one_count(n)으로 1의 갯수를 구해 count라는 값에 저장해놓는다.

  2. 이제 n을 임시 변수 tmp에 담아놓고 tmp를 1씩 증가시킨다.

  3. one_count(tmp)가 count와 같다면 위 조건을 만족하는 숫자이므로 정답으로 반환한다. 

 

코드는 다음과 같다.

int one_count(int num)
{
    int result = 0, count = 0, tmp = num;
    while(tmp != 0)
    {
        tmp /= 2;
        ++count;
    }
    for(int i = count - 1; i >= 0; --i)
        if((num >> i) & 1) result += 1;   
    return result;
}

int solution(int n) {
    int answer = n, count = one_count(n);
    while(true) if(count == one_count(++answer)) break;
    return answer;
}
반응형

'Algorithm > 문제' 카테고리의 다른 글

조이스틱 (프로그래머스)  (0) 2020.06.16
체육복 (프로그래머스)  (0) 2020.06.16
올바른 괄호 (프로그래머스)  (0) 2020.06.12
카펫 (프로그래머스)  (0) 2020.06.12
가장 큰 정사각형 찾기 (프로그래머스)  (0) 2020.06.10
Comments