문자열 내 맘대로 정렬하기_Java

컴투루·2022년 6월 27일
0

프로그래머스 Lv.1

목록 보기
19/38

연습문제

🔥 문자열 내 맘대로 정렬하기 🔥


👀 문제

문자열로 구성된 리스트 strings와 정수 n이 주어졌을때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하는 solution을 완성해보자


✔️ 조건

  • strings는 길이 1 이상, 50이하인 배열입니다.
  • strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
  • strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
  • 모든 strings의 원소의 길이는 n보다 큽니다.
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.

👩‍💻 입력 & 🧙 출력

stringsnreturn
["sun", "bed", "car"]1["car", "bed", "sun"]
["abce", "abcd", "cdx"]2["abcd", "abce", "cdx"]

🙋‍♀️ 풀이

import java.util.*;

class Solution {
    public String[] solution(String[] strings, int n) {
        String[] answer = {};
        ArrayList<String> list = new ArrayList<String>();
        
        for(int i=0;i<strings.length;i++){
            list.add(strings[i].charAt(n)+strings[i]);           
        }
        
        answer = list.toArray(new String[list.size()]);
        Arrays.sort(answer);
        
        for(int i=0;i<answer.length;i++){
           answer[i] =  answer[i].substring(1);
        }
        return answer;
    }
}
  1. strings의 길이만큼 반복문을 돌면서 charAt을 이용해 n번째 글자를 추출하고 strings의 i번째 문자와 합쳐서 list에 add해준다.
  2. list를 toArray를 이용해서 배열 answer에 대입하고
  3. Arrays.sort를 이용해서 오름차순으로 정렬한다.
  4. substring으로 앞 글자를 제거한 후 return 해준다.

성능 : 메모리: 89.9 MB, 시간: 9.10 ms


💬 다른 풀이

import java.util.*;

class Solution {
  public String[] solution(String[] strings, int n) {
      Arrays.sort(strings, new Comparator<String>(){
          @Override
          public int compare(String s1, String s2){
              if(s1.charAt(n) > s2.charAt(n)) return 1;
              else if(s1.charAt(n) == s2.charAt(n)) return s1.compareTo(s2);
              else if(s1.charAt(n) < s2.charAt(n)) return -1;
              else return 0;
          }
      });
      return strings;
  }
}

성능 : 메모리: 75.7 MB, 시간: 0.45 ms

성능차이 어마어마하다. 그동안 성능은 비교하지 않고 푸는 방법에 대해서만 생각했는데 내 코드는 9초가 걸리는에 위의 코드는 1초도 걸리지 않는다.

처음에는 나도 compare을 오버라이드 해볼생각이었는데 도전하지 않았다. 좋은 방법을 생각하고서도 그렇게 풀지 않다니...

데이터정렬 - Comparable, Comparator 를 보면

다른 방식으로 정렬하고 싶다면 Comparator를 사용해야 한다.

Comparator 인터페이스는 기준을 담당하는 것으로 정렬하기 전에 기준을 세우는건 딱 한번만 일어나는 일회성인 활동이기 때문에 익명 클래스로 많이 사용된다.

➕ compare은 리턴값이 양수이면 두 객체의 자리를 바꿔주는 역할
  1. strings는 string을 담고있는 배열이기 때문에 string인 s1과 s2를 비교한다.

  2. s1의 n번째 문자가 s2의 n번째 문자보다 크다면 1을 반환
    즉, s1이 오른쪽으로

  3. 같다면 사전순으로 s1.compareTo(s2)를 반환

  4. s1의 n번째 문자가 s2의 n번째 문자보다 작다면 -1을 반환
    즉, s1이 왼쪽으로

  5. 이외의 경우는 0을 반환

Comparator의 반환값에 따라서 달라는 것 체크!!


👏 마무리

다른 분들의 코드를 참고할때 성능도 함께 비교하자!

profile
맘 먹으면 못할 게 없지

0개의 댓글