Coding Test/Others

[Algorithm] 문자열 내 마음대로 정하기

byunghyun23 2020. 12. 7. 10:48

'문자열 내 마음대로 정하기' 정의는 다음과 같다.

 

문제 설명

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

제한 조건

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

입출력 예

strings n return
[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] 입니다.

 

다음과 같이 코드를 작성했다.

class Solution {
    public String[] solution(String[] strings, int n) {
        String[] answer = {};
        
        int length = strings.length;
        answer = new String[length];
        char[] idxValues = new char[length];
        int[] sortedIdx = new int[length];
        
        for (int i = 0; i < length; i++) {
            idxValues[i] = strings[i].charAt(n); 	// n번째 문자
            sortedIdx[i] = i;				// 정렬된 인덱스
        }
        
        int temp;
        char tmp;
        // 버블 정렬
        for (int i = length - 1; i > 0; i--) {
            for (int j = 0; j < i; j++) {
            	// 인덱스 문자 중복 확인
                if (idxValues[j] == idxValues[j + 1]) {
                    // 사전순 문자열 정렬 후 인덱스 저장 (sortedIdx)
                    if (strings[sortedIdx[j]].compareTo(strings[sortedIdx[j + 1]]) > 0) {
                        tmp = idxValues[j];
                        idxValues[j] = idxValues[j + 1];
                        idxValues[j + 1] = tmp; 
                        
                        temp = sortedIdx[j];
                        sortedIdx[j] = sortedIdx[j + 1];
                        sortedIdx[j + 1] = temp;
                    }
                }
                else if (idxValues[j] > idxValues[j + 1]) {
                    tmp = idxValues[j];
                    idxValues[j] = idxValues[j + 1];
                    idxValues[j + 1] = tmp;
                    
                    temp = sortedIdx[j];
                    sortedIdx[j] = sortedIdx[j + 1];
                    sortedIdx[j + 1] = temp;
                }
            }
        }
        
        // 정렬된 인덱스 배열 저장
        for (int i = 0; i < sortedIdx.length; i++) {
            answer[i] = strings[sortedIdx[i]];
        }
        
        return answer;
    }
    
}

1. idxValues[]에 n번째 문자를 저장한다.

2. n번째 문자 기준으로 스트링을 정렬(bubbleSort)한다.

3. 만약 n번째 문자 중복이 존재할 경우 해당 스트링들을 사전순으로 정렬한다.

4. sortedIdx[]에 strings[]를 정렬한 오름차순 인덱스 순서를 저장한다.

5. sortedIdx[]를 이용하여 strings[]로부터 정렬된 스트링 배열을 answer[]에 저장한다.

 

n번째 문자가 중복이 발생할 경우, 해당 스트링들을 사전순으로 정렬하는것이 문제라고 생각한다.

버블 정렬을 이용하여 스트링들을 비교하고, n번째 문자 중복시에는 String.compareTo()로 비교하여 사전순 정렬하였다.

idxValues[]도 정렬하고 있지만, 핵심은 sortedIdx[]이다. 정렬할 때마다 인덱스 값을 업데이트 한다.

정렬이 끝난 후에 sortedIdx[]를 strings[]의 인덱스 값으로 사용하여 정렬된 스트링배열 값을 얻을 수 있다.

                             

'Coding Test > Others' 카테고리의 다른 글

[Algorithm] 올바른 괄호  (0) 2020.12.07
[Algorithm] 스킬 트리  (0) 2020.12.07
[Algorithm] K번째 수  (0) 2020.11.10
[Algorithm] 소수 만들기  (0) 2020.11.10
[Algorithm] 영어 끝말잇기  (1) 2020.10.15