자료구조, 코딩테스트/정렬(Sort)

[코딩테스트] Programmers - 가장 큰 수 (실패)

RꞮbble 2026. 5. 22. 17:55

 

https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

풀이 1

최고차항 계수가 큰 것 순서대로 정렬을 하면 되겠다. 

먼저 최고차항을 반환해 주는 메서드를 만들었고, 이 메서드로 정렬을 하면 될 텐데.. 이걸 어떻게 해야 할지 모르겠다. 

 

 

풀이 2

잘 모르겠어서 llm(Gemini)에게 최고차항 계수를 기준으로 정렬하는 방법을 물어봤다. 

Linq메서드를 사용하면 된다고 한다. 예시로 알려준 메서드를 가져와서 적용해 봤다. 

 

 

코드 1 - 오답

using System;
using System.Text;
using System.Linq;

public class Solution {
    static StringBuilder sb = new StringBuilder();
    
    public int A(int number)
    {
        while(number / 10 > 0)
        {
            number = number / 10;
        }
        
        return number;
    }

    public string solution(int[] numbers) 
    {
        // string answer = "";
        
        numbers = numbers.OrderByDescending(number => A(number)).ToArray();
        foreach(int number in numbers)
        {
            sb.Append(number);
        }
        
        // return answer;
        return sb.ToString();
    }
}

 

최고차항 계수가 같은 경우에는 다음 자리와 비교를 해야 하는데 이때 비교 기준이 모호한 경우가 있어 정렬이 이상하게 되어 오답처리가 된다. 

 

 

풀이 3

3과 30을 비교해야 할 때 3은 다음 자리가 없다. 

이때 3이 더 큰지 30이 더 큰지 판단하는 로직이 필요하다. 

이렇게 하지 말고 그냥 문자열끼리 붙여서 비교하면 쉽다고 한다. 

Array.Sort(numbersStr, (x, y) => (y + x).CompareTo(x + y)) 

이런 식으로 말이다. 

 

 

코드 2 - 정답

using System;
using System.Text;
using System.Linq;

public class Solution {
    public string solution(int[] numbers) {
        string answer = "";
        
        string[] numbersStr = numbers.Select(number => number.ToString()).ToArray();
        
        Array.Sort(numbersStr, (x, y) => (y + x).CompareTo(x + y));
        
        if(numbersStr[0] == "0")
        {
            return "0";
        }
        
        StringBuilder sb = new StringBuilder();
        foreach(string str in numbersStr)
        {
            sb.Append(str);
        }
            
        return sb.ToString();
    }
}