ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C# 프로그래머스 Lv2 다음 큰 숫자
    코딩테스트 2020. 8. 19. 17:12

    자연수 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 이하의 자연수 입니다.

    입출력 예

    n                                                                            result

    78 83
    15 23

    입출력 예 설명

    입출력 예#1
    문제 예시와 같습니다.
    입출력 예#2
    15(1111)의 다음 큰 숫자는 23(10111)입니다.

     


    처음에는 접근을 패턴에 집중했다.

    이진수 1의 숫자가 3개라고 했을 때,

    0111    (7)  다음은

    1011   (11)

    1110   (13) 1의 이동에 초점을 맞췄었는데 머리가 아파서 포기했다.

     

    방향을 틀어서 입력받은 숫자의 이진수 1의 개수를 구해놓고 그 숫자부터 1씩 더할때마다 1의 개수를 구한다.

    그리고 이전에 구해놓은 1의 개수와 1씩더했을때 1의 개수가 같아지는 순간 return하고 break한다.

     

    매개변수 n의 1의 개수 구하기

     string n_string = Convert.ToString(n, 2);
     char[] n_char = n_string.ToCharArray();
     int one=0;
    
    for (int i = 0; i < n_char.Length; i++)
    {
    	if (n_char[i] == '1')
    	one++;
    }

    n보다 크고 2진수로 변환했을 때 1의 숫자가 같은 숫자 찾기

    while(true)
    {
    	one1 = 0; 
    	n++;
    	n_string = Convert.ToString(n, 2);
    	n_char = n_string.ToCharArray();
    
    	for (int i = 0; i < n_char.Length; i++)
    	{
    		if (n_char[i] == '1')
    			one1++;
    	}
    
    	if (one==one1)
    	{
    
    		return n;
    		break;
    	}
    
    }

     

     

     

    using System;
    
    class Solution 
    {
        public int solution(int n) 
       {
           
                string n_string = Convert.ToString(n, 2);
                char[] n_char = n_string.ToCharArray();
                int one=0;
    
                for (int i = 0; i < n_char.Length; i++)
                {
                    if (n_char[i] == '1')
                        one++;
                }
                int one1 = 0;
                while(true)
                {
                    one1 = 0; 
                    n++;
                    n_string = Convert.ToString(n, 2);
                    n_char = n_string.ToCharArray();
    
                    for (int i = 0; i < n_char.Length; i++)
                    {
                        if (n_char[i] == '1')
                            one1++;
                    }
                    
                    if (one==one1)
                    {
                
                        return n;
                        break;
                    }
    
                }
        }
    }
Designed by Tistory.