문제 풀기/C#

107. 큰 수 만들기

kagan-draca 2025. 4. 22. 18:36

 

기본 틀 :

 

using System;

public class Solution {
    public string solution(string number, int k) {
        string answer = "";
        return answer;
    }
}

 

문제가 쉬워보였지만 상당히 애먹었다...

 

처음에는 number.Legnth - k 개 문자열을 구성한 후 

 

해당 문자열에서 가장 작은 수를 제거하고

 

number에 남은 앞 글자를 추가하는 방식으로

 

max 값을 찾고자 했다...

 

그런데 그럴 경우 "시간 초과" 발생했다...

 

도무지 다른 방법이 보이지 않아서 다른 사람의 코드를 찾아보니

 

StringBuilder와 탐욕 기법으로 문제를 하셨다.

 

using System.Text;

 

        StringBuilder sb = new StringBuilder();

 

using System.Text; 로 import 할 수 있었고

 

StringBuilder sb = new StringBuilder()로 선언 가능했다.

 

탐욕 기법은

	// 탐욕 기법
        // 문자열 앞에서 부터 큰 수를 찾고 뒤의 큰 수를 찾는 과정 반복
        for(int i = 0, index = -1; i < number.Length - k; i++)
        {
            char max = '0';
            
            for(int j = index + 1; j <= k + i; j++)
            {
                // 유니코드 비교
                // '0' : 48 ~ '9' : 57
                // 이라 비교문 동작 가능
                if(max < number[j])
                {
                    max = number[j];
                    // index를 조정해 이전에 찾은 최대값 다시 찾지 않도록 설정
                    index = j;
                }
            }
            
            // '+' 연산자와 동일하지만 
            // '+' 연산자는 글자 추가마다 새로운 문자열로 만드는 형식인데
            // append는 그냥 붙이는 형식이라 성능이 더 우수하다
            sb.Append(max);
        }

 

for문을 사용해 number를 순회하는데 이때 특이한 점은 int i 뿐만 아니라, index = -1을 선언하는 것이다.

 

이 index는 하나의 가장 큰 숫자를 찾은 이후 그 뒤 문자열에서 다음 제일 큰 숫자를 찾기 위해서 사용 됐다.

 

전체 코드 : 

 

using System;
using System.Text;

public class Solution {
    public string solution(string number, int k) 
    {
        StringBuilder sb = new StringBuilder();
        
        // 탐욕 기법
        // 문자열 앞에서 부터 큰 수를 찾고 뒤의 큰 수를 찾는 과정 반복
        for(int i = 0, index = -1; i < number.Length - k; i++)
        {
            char max = '0';
            
            for(int j = index + 1; j <= k + i; j++)
            {
                // 유니코드 비교
                // '0' : 48 ~ '9' : 57
                // 이라 비교문 동작 가능
                if(max < number[j])
                {
                    max = number[j];
                    // index를 조정해 이전에 찾은 최대값 다시 찾지 않도록 설정
                    index = j;
                }
            }
            
            // '+' 연산자와 동일하지만 
            // '+' 연산자는 글자 추가마다 새로운 문자열로 만드는 형식인데
            // append는 그냥 붙이는 형식이라 성능이 더 우수하다
            sb.Append(max);
        }
        
        // 문자열로 변환 후 반환
        return sb.ToString();
    }
}