본문 바로가기
코딩테스트 준비/프로그래머스

프로그래머스 C# - 다음 큰 숫자

by 코딩하는 돼징 2023. 12. 15.
반응형

문제를 이해하면 쉽게 이해할 수 있는 문제이다.

간단히 설명하자면 주어진 숫자에서 1의 갯수와 같은 다음 숫자를 구하면 된다.

 

C#에서 Convert.ToString을 이용하면 쉽게 진법변환을 할 수 있다. (자세한 내용은 아래 게시글 참조)

 

C# - Convert.ToString 메서드로 진수 변환(10진수를 2진수, 8진수, 16진수로)

Convert.ToString 메서드 정수,실수,날짜등 다양한 데이터 유형을 문자열로 변환한다. public static string ToString(int value, int toBase); 매개변수 value : 변환할 32비트 부호 있는 정수 toBase : 변환 값의 진수로

code-piggy.tistory.com


문제 푸는 순서

01 n을 2진수로 바꾼 다음 1의 갯수 구하기

int answer = 0;
string s = Convert.ToString(n,2);
int count = 0;
        
for(int i = 0; i<s.Length;i++)
{
    if(s[i] == '1') count++;
}

02 n을 1씩 증가시킨 다음 n과 1의 갯수가 같은 숫자 구하기

while(true)
{
    n++;
    string s2 = Convert.ToString(n,2);
    int count2 = 0;
    for(int i = 0; i<s2.Length;i++)
    {
        if(s2[i] == '1') count2++;
    }
    if(count == count2) break;
}

코드 전문

using System;

class Solution 
{
    public int solution(int n) 
   {
        int answer = 0;
        string s = Convert.ToString(n,2);
        int count = 0;
        
        for(int i = 0; i<s.Length;i++)
        {
            if(s[i] == '1') count++;
        }
        
        while(true)
        {
            n++;
            string s2 = Convert.ToString(n,2);
            int count2 = 0;
            for(int i = 0; i<s2.Length;i++)
            {
                if(s2[i] == '1') count2++;
            }
            if(count == count2) break;
        }
        answer = n;
        return answer;
    }
}

틀린 풀이

결과적으로 이 풀이를 했을때는 시간 초과가 나왔다.

매번 문자열을 배열로 변환하면서 1의 요소의 개수를 세기 때문에 n이 매우 클 경우 시간 초과가 발생하였다.

using System;
using System.Linq;
class Solution 
{
    public int solution(int n) 
   {
        int answer = 0;
        int count = Convert.ToString(n, 2).ToArray().Where(x => x == '1').Count();
        while (true)
        {
            n++;
            int count2 = Convert.ToString(n, 2).ToArray().Where(x => x == '1').Count();
            if(count2 == count)
                break;
        }
        return n;
    }
}

 

 

 

 

 

반응형

댓글