_DoYun
_yunilog
_DoYun
전체 방문자
오늘
어제
  • 전체 (83)
    • spring boot main 프로젝트 해결 (2)
    • 회고 (0)
      • pre-project(stackoverflow) (0)
    • 지식창고 (25)
    • 후기 (1)
    • LINUX (2)
    • HTML&CSS (2)
    • SQL (2)
    • 기술 면접 질문지 (1)
      • Chapter1 (1)
      • Chapter2 (0)
    • JAVA (25)
      • JAVA 기초 문법 (1)
      • Collection (1)
      • Enum,Annotation,Stream,람다 (3)
      • 입출력, Thread, JVM (1)
      • Spring Framework (3)
      • Spring MVC (6)
      • JPA (1)
      • Test (3)
      • API 문서 (1)
      • 인증&보안 (2)
      • AWS (2)
    • 알고리즘 (19)
      • 프로그래머스_LEVEL_3 (6)
      • 백준 (0)
      • 프로그래머스_LEVEL_2 (13)
    • Comento (2)
    • Inflearn (2)
      • HTTP (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
_DoYun

_yunilog

알고리즘/프로그래머스_LEVEL_2

[프로그래머스] 가장 큰 수 (정렬)-JAVA

2022. 6. 4. 18:05

[문제 설명]

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

 

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

 

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

[제한 사항]

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

[풀이]

해당 문제에서 최종 결과의 반환 타입은 String(문자열)입니다. 또한 문제를 쉽게 해결하기 위해서는 정렬을 사용해야 하는데, 많은 사람들이 알고 있다시피 int형 타입의 배열을 정렬하면 10이 6보다 크다는 결과가 출력됩니다.

 

그러나 우리가 구하고자 하는 답은 6이 10보다 커야되기 때문에 int형 타입으로 주어진 numbers 배열을 문자형으로 변환하는 것부터 시작합니다. 

        String[] arr = new String[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            arr[i] = numbers[i] + "";
        }

arr라는 String 타입 배열에 모든 값을 문자열화 하여 저장합니다. 그 이후 정렬을 시작하는데, 여기서 주의할 점이 있습니다.

String[] arr = {"3", "30", "34", "5", "9"};
Arrays.sort(arr, Collections.reverseOrder());

//9 5 34 30 3

다음과 같은 arr 배열의 문자열 값들을 Arrays.sort를 이용하여 내림차순 하게 되면 9 5 34 30 3 순서로 정렬되게 됩니다. 그러나 우리가 원하는 것은 최댓값인 9 5 34 3 30 형태입니다. 이를 해결하기 위해 Comparator를 사용합니다. 

        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                
                return (o2+o1).compareTo(o1+o2);
            }
        });

예를 들어 o1이 30이고 o2가 3이라 가정한다면, ("330").compareTo("303")의 결과를 리턴하게 됩니다. 당연히 둘의 차이를 계산하게 되면 양수 값이 리턴되게 됩니다. 값이 어떻게 나오던 양수값이 출력되면 둘의 자리는 교체되게 됩니다. 즉 9 5 34 30 3의 순서에서 9 5 34 3 30의 순서로 변환되는 것입니다. 

 

최종 코드입니다.

import java.util.Arrays;
import java.util.Comparator;
class Solution {
    public String solution(int[] numbers) {
     
		String[] arr = new String[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            arr[i] = numbers[i] + "";
        }

        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                
                return (o2+o1).compareTo(o1+o2);
            }
        });
        
        String answer = "";
        
		if (arr[0].equals("0"))
			answer = "0";
		else {
			for (int i = 0; i < arr.length; i++) {
				answer += arr[i];
			}
		}
        
		return answer;
	}

}

참고로

        if (arr[0].equals("0"))
		answer = "0";

해당 코드의 의미는 주어진 배열이 [0,0,0,0] 같이 0으로만 이어질 경우 최종 리턴이 "0000"이 아닌"0" 이어야 하기 때문에 추가한 코드라고 보시면 됩니다.

'알고리즘 > 프로그래머스_LEVEL_2' 카테고리의 다른 글

[프로그래머스] 피로도-JAVA  (0) 2022.11.13
[프로그래머스] 두 큐 합 같게 만들기-JAVA  (0) 2022.08.25
[프로그래머스] 튜플 (2019 카카오 개발자 겨울 인턴십)-JAVA  (0) 2022.06.02
[프로그래머스] 수식 최대화 (2020 카카오 인턴십)-JAVA  (0) 2022.06.01
[프로그래머스] 거리두기 확인하기(2021 카카오 채용연계형 인턴십)-JAVA  (0) 2022.05.31
    '알고리즘/프로그래머스_LEVEL_2' 카테고리의 다른 글
    • [프로그래머스] 피로도-JAVA
    • [프로그래머스] 두 큐 합 같게 만들기-JAVA
    • [프로그래머스] 튜플 (2019 카카오 개발자 겨울 인턴십)-JAVA
    • [프로그래머스] 수식 최대화 (2020 카카오 인턴십)-JAVA
    _DoYun
    _DoYun

    티스토리툴바