[JAVA] 프로그래머스 (Lv.1) 문자열 내 마음대로 정렬하기

AIR·2023년 8월 24일
0

링크

https://school.programmers.co.kr/learn/courses/30/lessons/12915


문제 설명

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.


제한 조건

  • 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) {
    	//같은 인덱스 값으로 정렬했을때도 정렬이 되어야 하므로
        //먼저 배열을 정렬부터 한다
        Arrays.sort(strings);
        //Arrays 클래스의 sort 메서드는 기본으로 오름차순으로 정렬
        //따라서 인터페이스 Comparator의 compare메서드를 오버라이드하여 사용
        //String 값인 o1, o2를 배열의 원소의 n번째 인덱스 값으로 할당하여
        //n번째 인덱스 값을 기준으로 오름차순 정렬을 수행
        Arrays.sort(strings, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                o1 = String.valueOf(o1.charAt(n));
                o2 = String.valueOf(o2.charAt(n));
                return o1.compareTo(o2);
            }
        });
        return strings;
    }
}

다른 사람의 풀이

import java.util.*;

class Solution {
    public String[] solution(String[] strings, int n) {
        String[] answer = {};
        ArrayList<String> arr = new ArrayList<>();
        for (int i = 0; i < strings.length; i++) {
            arr.add("" + strings[i].charAt(n) + strings[i]);
        }
        Collections.sort(arr);
        answer = new String[arr.size()];
        for (int i = 0; i < arr.size(); i++) {
            answer[i] = arr.get(i).substring(1, arr.get(i).length());
        }
        return answer;
    }
}

속도가 느리지만 아이디어가 좋다.
인덱스 값을 맨 앞으로 옮긴 뒤 정렬한다.


정리

코딩 첫 시작을 하는데 좀 오래 걸렸다.
인덱스 값으로 따로 배열을 만들고 정렬을 하자니 원래 주어진 배열과 어떻게 동기화 시킬거며..
고민을 하다가 최대한 코드를 짧게 쓰고 싶어서
그냥 바로 정렬하는 방법을 찾아 해맸다.
Arrays.sort()는 알고 있었으나 내 뜻에 맞게 정렬 조건을 바꿀수 있는지 찾아보다가
Comparable 인터페이스의 compareTo 메서드와
Comparator 인터페이스의 compare 메서드를 이용할 수 있었다. (매개 변수를 1개를 받냐 2개 받냐의 차이)
나는 2개의 매개변수를 비교해야 하였기 때문에 compare 메서드를 이용하였고
Comparator 인스턴스를 생성하여 compare메서드를 오버라이드하였다.
그리고 다음과 같이 람다식으로도 표현할 수 있었다.

Arrays.sort(strings, (o1, o2) -> {
            o1 = String.valueOf(o1.charAt(n));
            o2 = String.valueOf(o2.charAt(n));
            return o1.compareTo(o2);
        });

참고

배열 정렬하기 : https://ifuwanna.tistory.com/232
Comparable과 Comparator
: https://st-lab.tistory.com/243
: https://devfunny.tistory.com/550
: https://hwannny.tistory.com/93

profile
백엔드

0개의 댓글