[프로그래머스][Level2][Java] 가장 큰 수

2022. 3. 25. 20:52·프로그래머스/Level 2

문제

 

풀이코드

public String solution(int[] numbers) {         //가장 큰 수
    String answer = "";
    String[] arr = new String[numbers.length];  //int배열을 넣을 String배열 새로 생성
    for(int i = 0; i < numbers.length; i++){    //int배열을 String배열로 변경시켜서 대입
        arr[i] = String.valueOf(numbers[i]);
    }
    Arrays.sort(arr,new Comparator<String>(){   //String 배열을 특별한 방식으로 내림차순으로 변경
        @Override
        public int compare(String o1, String o2) {
            return (o2+o1).compareTo(o1+o2);
        }
    });
    for(String x : arr){                        //내림차순으로 정렬한 String배열을 answer에다가 넣음
        answer += x;
    }
    if(arr[0].equals("0")){                     //모든 배열이 0인 경우도 있으므로 그땐 0을 return
        return "0";
    }

    return answer;
}

우선, 처음에는 조합들을 찾아서 예를 들어, 6과 10의 비교면 6과 1을 비교하고 6이 더 크니까 610이렇게 만들고

33과 34의 비교면 3과 3을 비교한 뒤, 같으면 그 뒷자리인 3과 4를 비교해서 더 큰 3433이렇게 만들고 이런식으로해서 풀었는데...내심 풀면서 이거 배열이 많아지면 터질 것 같은데...라고 생각했는데 역시나 터져버렸다....

그래서 다른 분들의 풀이를 살짝 보았는데 다들 Comparator을 사용해서 푸시길래 지금까지는 Comparator의 개념만

대충알았지 적재적소에 어떻게 사용하는지는 잘 몰라서 이번 기회에 Comparator에 대해서 좀 더 자세히 알아보았다.

 

보니까 compare메서드를 오버라이드해서 사용을 할 때 나는 단순히 a.compareTo(b)이렇게 return하면 오름차순이고

내림차순으로 return하려면 b.compareTo(a)이렇게 써야된다고 외웠는데, 이게 그런 개념이 아니였다.

일단 return값이 음수면 순서가 그대로고 양수면 순서가 바뀐다!!! 이것만 알면 되는데

a=10, b=6이라고 가정을 했을 때, 10.compareTo(6)를 하면 10-6값을 구한다. 그러면 양수(4)이므로 순서가 바뀐다.

즉, 원래는 {10,6}였던 것이 {6,10}으로 바뀌는 것이다. 이렇게 되서 오름차순으로 바뀌는 것이고

만약, 6.compareTo(10)을하면 6-10값을 구하는데 음수(-4)가 되므로 순서가 바뀌지 않는다.

즉, 원래모양 그대로인 {10,6}이 유지가 되어서 내림차순이 되는 것이다.

 

이것을 토대로 위 문제에서 적용을 하자면 예시코드에 나와있는 {6,10,2}를 예를 들어서 사용하자면

우리는 문제에서 저 3개의 수를 조합해서 제일 큰 값을 만들어야 하는데 단순히 a.compareTo(b)꼴로 비교를 하면

제일 큰 값을 내림차순으로 비교를 한다고 해도 1062가 나온다. 그러면 우리가 구해야 하는 6210과는 완전히 다른데

그래서 저 3개의 수 중에 일단은 2개의 수를 이어붙인다. 610, 106이런식으로 그리고 비교를 해서 더 큰 수를 앞으로 배열한다.

그러면 {6,10,2} -> {6,10,2}가 되고 그다음 또 두 수를 비교한다. 102, 210이렇게 그러면 둘 중에 또 큰 수를 앞으로 배열한다.

그러면 {6,10,2} -> {6,2,10}가 되고 이것을 다 이어붙이면 우리가 원하는 6210이 나온다!!!

그리고 (b+a).compareTo(a+b)꼴은 위에서 설명한대로 생각하면 만약에 b+a가 더 크면 a,b의 순서가 바뀐다.

그러므로 a = 10, b = 2라고 가정하고 예시를 들면 210.compareTo(102)를 했을 때, 210이 더 크므로 10과 2의 순서가 바뀌어서 {6,10,2} -> {6,2,10}꼴이 되는 것이다!!!

Comparator가 정말 처음 봤을 땐 이해하기가 좀 어려웠는데 문제를 풀면서 다시 한번 접하니까 이해가 쉽게 되어서 좋았다!!!

저작자표시 비영리 (새창열림)

'프로그래머스 > Level 2' 카테고리의 다른 글

[프로그래머스][Level2][Java] 스킬트리  (0) 2022.04.01
[프로그래머스][Level2][Java] 방문 길이  (0) 2022.04.01
[프로그래머스][Level2][Java] 타겟 넘버  (0) 2022.03.25
[프로그래머스][Level2][Java] 더 맵게  (0) 2022.03.23
[프로그래머스][Level2][Java] 주식가격  (0) 2022.03.21
'프로그래머스/Level 2' 카테고리의 다른 글
  • [프로그래머스][Level2][Java] 스킬트리
  • [프로그래머스][Level2][Java] 방문 길이
  • [프로그래머스][Level2][Java] 타겟 넘버
  • [프로그래머스][Level2][Java] 더 맵게
BvrPark
BvrPark
코드 퍼즐과 개발 일상
  • BvrPark
    비버의 개발 일지
    BvrPark
  • 전체
    오늘
    어제
    • 분류 전체보기 (121)
      • JAVA (7)
        • 메서드 외울 것 (2)
      • 프로그래머스 (56)
        • 총 풀이 코드(깃허브) (1)
        • Level 1 (22)
        • Level 2 (33)
      • 백준 알고리즘(단계 별) (16)
        • 총 풀이 코드(깃허브) (1)
        • 1. 입출력과 사칙연산 (2)
        • 2. if 문 (2)
        • 3. for문 (1)
        • 4. while문 (2)
        • 5. 1차원 배열 (3)
        • 6. 함수 (1)
        • 7. 문자열 (1)
        • 8. 기본수학 1 (3)
      • 백준 알고리즘(solved.ac) (9)
        • 총 풀이 코드(깃허브) (1)
        • class2 (8)
      • LeetCode 문제 풀이 (4)
        • 총 풀이 코드(깃허브) (1)
        • Easy (3)
      • 코드업 알고리즘 (7)
      • git과 github사용법 (4)
      • html, css, javaScript (2)
      • 프로젝트 (11)
        • 순수 Java 프로젝트 (2)
        • 쇼핑몰 프로젝트 (2)
        • 게시판 프로젝트 (5)
        • 근태관리 프로젝트 (2)
      • 커피타임 (2)
        • 2023년 (2)
        • 2024년 (0)
  • 블로그 메뉴

    • 링크

      • 포트폴리오
      • 깃허브
    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • Designed By정상우
    BvrPark
    [프로그래머스][Level2][Java] 가장 큰 수
    상단으로

    티스토리툴바