본문 바로가기
코딩테스트/정렬

배열(Arrays)의 효율적인 사용

by asdft 2024. 2. 7.

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"

풀이의 키포인트

1. Arrays.sort() 내부에서 Comparator의 compareTo()를 이용하는 방식을 이용해 한 줄짜리 가독성 좋은 코드를 작성 가능했다.

      Arrays.sort(arr,(o1,o2) -> (o2+o1).compareTo(o1+o2)); 

: 두 String값을 이어붙였을때, 큰값이 왼쪽에 오도록 sorting (내림차순)

      Arrays.sort(arr,(o1,o2) -> (o1+o2).compareTo(o2+o1)); 

: 두 String값을 이어붙였을때, 큰값이 오른쪽에 오도록 sorting (오름차순)

 

참고)

https://yuja-kong.tistory.com/172

 

[Java] compareTo 숫자, 문자열 비교

[Java] compareTo 숫자, 문자열 비교 compareTo int compareTo(NumberSubClass referenceName) int compareTo(String anotherString) 두 개의 값을 비교하여 int값으로 반환해주는 함수이다. 문자열의 비교, 숫자의 비교 방식이

yuja-kong.tistory.com

https://ifuwanna.tistory.com/232

 

[Java] 배열(Array) 정렬 하기 ( 오름차순,내림차순 등 )

| Arrays.sort() java.util.Arrays 유틸리티 클래스를 사용하면 배열(Array)을 정렬, 복제하거나, List로 변환 하는 등의 작업을 쉽게 처리 할 수 있습니다. 해당 클래스의 sort() 메서드를 사용하면 쉽게 오름

ifuwanna.tistory.com

 

 

2. 정렬된 숫자를 이어붙이는 경우 String 값을 더하는 것보다 StringBuilder 이용해 append()하는 것을 추천한다.

이유는 String의 Immutable에 대해 리서치해보면 알 수 있다. 어쨌든 String을 합치는 연산이 많을수록 StringBuilder가 유리하다.

이 String 객체끼리 더하는 방법은 메모리 할당과 해제를 발생시키는데, 덧셈 연산이 많아진다면 성능적으로 좋지 않다.
관련 내용은 아래 링크에 설명되어 있다.

자바에서 String 객체는 변경 불가능하다. 한 번 생성되면 내용을 바꿀 수 없단 뜻이다. 따라서 하나의 문자열을 다른 문자열과 연결하면 새 문자열이 생성되고, 이전 문자열은 가비지 컬렉터로 들어간다.

 

참고)

https://www.codejava.net/java-core/the-java-language/why-use-stringbuffer-and-stringbuilder-in-java

 

Why Use StringBuffer and StringBuilder in Java

 

www.codejava.net

 


코드

import java.util.Arrays;
class Solution {
    public String solution(int[] numbers) {
        String[] arr = new String[numbers.length];
        
        for(int i=0; i<numbers.length;i++){
            arr[i] = String.valueOf(numbers[i]);	//String 타입의 배열로 변경
        }
        
        Arrays.sort(arr,(o1,o2) -> (o2+o1).compareTo(o1+o2));	//내림차순 정렬
        
        if(arr[0].equals("0")){
            return "0";
        }
        
        StringBuilder answer = new StringBuilder();
        
        for(int i=0;i<arr.length;i++){
            answer.append(arr[i]);
        }
        
        return answer.toString(); //StringBuilder 객체의 경우 .toString()으로 문자열로 만들어줘야 함
    }
}

 

 

[참고]

https://yuja-kong.tistory.com/172

 

[Java] compareTo 숫자, 문자열 비교

[Java] compareTo 숫자, 문자열 비교 compareTo int compareTo(NumberSubClass referenceName) int compareTo(String anotherString) 두 개의 값을 비교하여 int값으로 반환해주는 함수이다. 문자열의 비교, 숫자의 비교 방식이

yuja-kong.tistory.com

https://ifuwanna.tistory.com/232

 

[Java] 배열(Array) 정렬 하기 ( 오름차순,내림차순 등 )

| Arrays.sort() java.util.Arrays 유틸리티 클래스를 사용하면 배열(Array)을 정렬, 복제하거나, List로 변환 하는 등의 작업을 쉽게 처리 할 수 있습니다. 해당 클래스의 sort() 메서드를 사용하면 쉽게 오름

ifuwanna.tistory.com

 

 

 

https://onlyfor-me-blog.tistory.com/317

 

[JAVA] StringBuilder란? StringBuilder 사용법

자바에서 문자열하면 String을 대개 많이 떠올리고 사용할 것이다. 그런데 이 문자열이 1개 이상 있어서 이것들을 더해야 한다고 하면 어떤 방법을 쓸 수 있을까? 간단하게는 이 방법을 쓸 수 있을

onlyfor-me-blog.tistory.com