[Java] 문자열 내 마음대로 정렬하기 (programmers)

Haeun Noh·2023년 5월 24일
0

programmers

목록 보기
45/64
post-thumbnail

0525


문제 설명

문자열로 구성된 리스트 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"]

입출력 예 설명

입출력 예 1
"sun", "bed", "car"의 1번째 인덱스 값은 각각 "u", "e", "a" 입니다. 이를 기준으로 strings를 정렬하면 ["car", "bed", "sun"] 입니다.

입출력 예 2
"abce"와 "abcd", "cdx"의 2번째 인덱스 값은 "c", "c", "x"입니다. 따라서 정렬 후에는 "cdx"가 가장 뒤에 위치합니다. "abce"와 "abcd"는 사전순으로 정렬하면 "abcd"가 우선하므로, 답은 ["abcd", "abce", "cdx"] 입니다.



풀이 방식

이 문제는 문자열 안에서 특정 인덱스의 character를 기준으로 문자열을 정렬하는 문제입니다.
단, 해당 인덱스의 character가 같을 경우 정렬 기준은 사전순서를 기준으로 합니다.

처음에는 이중 for문을 사용하여 앞 문자열의 n번째 character와 뒷 문자열의 n번째 character를 비교하여 strings배열 안에서만 두 문자열을 치환하는 방향으로 풀었습니다.

하지만 왜인지 정렬이 잘 되지 않았고, 문제가 잘 풀리지 않았습니다..

그래서 저는 또 다른 방법이 없을까 탐색하다가 이러한 알고리즘을 통해 답을 구하게 되었습니다.

  1. 답을 저장할 새로운 문자열 배열인 answer을 선언합니다. 단, 길이는 strings와 동일하게 합니다.

strings의 문자열을 다 저장해야 하기 때문입니다.

  1. answer의 인덱스를 저장할 변수인 idx를 선언하여 0으로 초기화합니다.

for문i j와는 별개로 떨어뜨려놓음으로써 제가 원할 때만 증가시킬 수 있게 됩니다.

  1. Arrays.sort()를 사용하여 미리 사전순으로 오름차순 정렬을 합니다.

이는 두 문자열의 n번째 character가 동일할 경우를 대비하는 것입니다. 만약 기준이 되는 character가 동일하더라도 이미 사전순으로 정렬이 되어있기 때문에 따로 정렬이 필요없어지게 됩니다.

  1. a~z까지 i를 반복하고, strings의 문자열의 n번째 character를 비교하여 같다면 answer[idx]n번째 character가 같은 문자열인 strings[j]를 저장하여 정렬이 된 배열을 리턴할 수 있도록 합니다.
    idx++을 통해 answer[idx]에 저장한 뒤 idx값이 증가되어 다음 문자열은 다음 answer의 방에 집어넣을 수 있게 됩니다.


소스 코드

import java.util.Arrays;
class Solution {
    public String[] solution(String[] strings, int n) {
        String[] answer = new String[strings.length];
        int idx = 0;
        Arrays.sort(strings);
        for ( int i = 'a'; i < 'z'; i++) {
            for ( int j = 0; j < strings.length; j++) {
                if ( (char)i == strings[j].charAt(n) )
                    answer[idx++] = strings[j];
            }
        }
        return answer;
    }
}


실행 결과



profile
기록의 힘을 믿는 개발자, 노하은입니다!

0개의 댓글