[ 가장 큰 수 ]
https://school.programmers.co.kr/learn/courses/30/lessons/42746
문제 설명
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을 반환하기 위해서 사용했다.
'코딩 공부 > 프로그래머스 코딩테스트' 카테고리의 다른 글
[프로그래머스] 2016년 | C# (0) | 2023.08.27 |
---|---|
[프로그래머스] 의상 | C# (0) | 2023.06.30 |
[프로그래머스] 게임 맵 최단거리 | C# (0) | 2023.06.27 |
[프로그래머스] 타겟 넘버 | C# (0) | 2023.06.26 |
[프로그래머스] 점프와 순간이동 | C# (0) | 2023.06.20 |