본문 바로가기
개발/문제풀이

문제풀이)프로그래머스)c#) 가장 큰 수

by 테샤르 2020. 9. 7.

가장 큰 수

 

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

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 ��

programmers.co.kr

문제는 심플하다 주어진 numbers를 결합해서 가장 큰 수를 만드는 값을 return 하는 문제이다.

 

처음 짠 소스는 다음과 같다.

using System;
using System.Collections.Generic;

public class Info{
   public int tempValue;
    public int value;
    public Info(int _realValue, int _tempValue){
        value =_realValue;
        tempValue =_tempValue;
    }

    public int GetValue(){
        return value;;
    }

    public int GetTempValue(){
        return this.tempValue;
    }
}

public class Solution {
public string solution(int[] numbers) {
         string answer = "";
        
        List<Info> list = new List<Info>();
        int maxLength = 4;
        
        var builder = new System.Text.StringBuilder();
        for(int i = 0;i<numbers.Length;i++){
            
            if(builder.Length > 0){
                builder.Remove(0,maxLength);
            }
            int realValue = numbers[i];
            builder.Append(realValue.ToString());
            while(builder.Length < 4 ){
                builder.Append("0");
            }
            
            list.Add(new Info(realValue, int.Parse(builder.ToString())));
        }
        
        list.Sort((Info a, Info b)=>{

            return b.GetTempValue().CompareTo(a.GetTempValue());
        });

        for(int i = 0; i<list.Count;i++){
            answer += list[i].GetValue();
        }

        if( 0 == int.Parse(answer)){
            answer = "0";
        }
        
        return answer;
    }
}

시간 초과로 인해서 통과를 못하더라. 에효..  값을 정상적으로 나온 걸 테스트했다.

나중에 검색하고  Linq를 통해서 최적화된 코드는 다음과 같다.

 using System.Linq;
using System;

 public string solution(int[] numbers) {
        
        Array.Sort(numbers, (x,y)=>{
            string tempXY = x.ToString() + y.ToString();
            string tempYX = y.ToString() + x.ToString();
            return tempYX.CompareTo(tempXY);
        });

        if(numbers.Where(x => x == 0).Count() == numbers.Length){
            return "0";
        }
        else{
            return string.Join("",numbers);
        }
}

테스트 케이스 항목들이다.

// [[6, 10, 2], "6210"],
// [[3, 30, 34, 5, 9], "9534330"],
// [[10, 101], '10110'],
// [[1, 11, 111, 1111], '1111111111'],
// [[0, 0, 0, 0, 0, 0], '0'],
// [[2,20,200], '220200'],
// [[0,0,70], '7000'],
// [[0,0,0,1000], '1000000'],
// [[0,0,1000,0], '1000000'],
// [[1000,0,0], '100000'],
// [[12,121], '12121'],
// [[21,212], '21221'],
// [[11, 12, 10], '121110'],
// [[0,0,0,1], '1000'],
// [[1,2,3,1,1,3], '332111'],
// [[1,2,21, 21], '221211']

 

 

 ★

 

반응형

댓글