본문 바로가기

개발일지

20231204 - 프로그래머스/12915

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

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

 

제한 사항

strings는 길이 1 이상, 50 이하인 배열

strings의 원소는 소문자 알파벳

원소는 길이 1 이상, 100이하인 문자열 

모든 strings의 원소의 길이는 n보다 큼

인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치

 

예시

Strings : ["abce", "abcd", "cdx"]

n : 2

결과 : ["abcd", "abce", "cdx"]

 

풀이 과정

처음에는 n번째 인덱스의 앞 부분을 substring을 통해 날리고 정렬하면 되겠다 생각했지만, 다시 정렬하면서 원래 문자열로 바꿔주는 과정에서 어려움을 느꼈고, for문을 이용해 문자열 하나하나 비교하려고 하니 코드가 굉장히 복잡해지는 것을 느꼈다. 그래서 이전에 Arrays.sort() 메서드를 사용하면서 내가 직접 정렬의 기준을 재정의 하는 방법을 본 기억을 되살려 정렬 기준을 바꾸기로 했고 문제가 의도한 풀이 방향도 이쪽과 가깝다고 생각했다. 사용방법은 아래 코드처럼 메서드를 재정의 해주는 코드를 추가해 주면 된다. 우선 n번째 인덱스의 문자가 같을 경우 사전 순으로 앞선 문자열이 앞쪽에 위치해야 하므로 기존 정렬방식처럼 두었고, 그 외에 경우에는 n번째 문자열을 비교하여 정렬할 수 있도록 했다.

 

class Solution {
    public String[] solution(String[] strings, int n) {
        String[] answer;

        Arrays.sort(strings, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if(o1.charAt(n) - o2.charAt(n) == 0){
                    return o1.compareTo(o2);
                }else{
                    return o1.charAt(n) - o2.charAt(n);
                }
                    
            }
        });

        answer = Arrays.copyOf(strings,strings.length);
        return answer;
    }
}