코딩 공부/프로그래머스 코딩테스트

[프로그래머스] 가장 큰 수 | C#

maintain_H 2023. 6. 29. 18:55
반응형

[ 가장 큰 수 ]

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

 

제한 사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

 

입출력 예

numbers return
[6, 10, 2] "6210"
[3, 30, 34, 5, 9] "9534330"

 

 

[ 풀이 ]

using System;
// stringbuilder 사용하기 위해 호출
using System.Text;
// Any 사용하기 위해 호출
using System.Linq;

public class Solution {
    public string solution(int[] numbers) {
    	// 입력된 정수 배열을 문자열로 저장하기 위해 문자열 배열 생성
        string[] numbersStr = new string[numbers.Length];
        
        // for문을 통해 각 숫자들을 문자열로 변환하여 저장
        for(int i = 0; i < numbersStr.Length; i++)
            numbersStr[i] = numbers[i].ToString();
        
        // 배열을 내림차순으로 정렬, 정렬 기준은 두 문자열을 이어 붙인 결과의 대소 비교.
        // y + x와  x + y를 비교해 정렬
        Array.Sort(numbersStr, (x, y) => string.Compare(y + x, x + y));
        
        // 문자열을 효율적으로 처리하기 위해 StringBuilder 생성
        StringBuilder sb = new StringBuilder();
        
        // for문을 통해 정렬된 문자열을 sb에 추가
        for(int i = 0; i < numbersStr.Length; i++)
            sb.Append(numbersStr[i]);
        
        // sb에 저장된 문자열을 최종적인 결과 문자열로 변환.
        string resultNum = sb.ToString();
        
        // 만약 결과 문자열에 0이 아닌 숫자가 존재할 경우 resultNum 반환
        if(resultNum.Any(match => match != '0')) return resultNum;
        
        return "0";
    }
}

 

StirngBuilder를 사용한 이유 

 string 타입은 변경할 수 없는 데이터타입인데, 이 말은 데이터의 값이 바뀔 때마다 새로운 메모리를 사용하고, 이전 값들은 garbage로 쌓인다는 것이다. 결국 많은 string 타입을 사용한다면 뭐.. 속도가 느려지고, 문제의 제한 사항에 걸린다는 말이다.

 StringBuilder는 변경할 수 있는 데이터타입으로 문자열을 조합할 때마다 새로운 변수를 생성할 필요가 없다. StringBuilder 내부에 일정한 양의 메모리를 미리 할당하고 사용하기 때문에 속도가 빠르고, 제한 사항에 걸리지 않는다.

 문자열을 연결하거나 많은 문자열을 사용해야 할 경우 StringBuilder를 사용하자!

 

Any 메서드

 Linq에서 지원하는 기능.

Any는 조건에 해당하는 값이 한 개라도 존재한다면 "true"를 반환한다.

여기서는 문자열 resultNum이 0이 아니라면 resultNum을 반환하기 위해서 사용했다.

 

반응형