요즘 자소서만 쓰다보니 코딩에 무뎌져서 감각 좀 살릴 겸

차근차근 다시 lv.1 짜리 위주로 문제풀고있는데 정렬 문제가 생각이 안나서 멘붕


그래서 정리 할 겸 작성 해 봅니다.



시작!


내 마음대로 정렬하기

[문제 설명]

문자열로 구성된 리스트 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] 입니다.

[문제 풀이]

문제 푸는 과정

1. 기본문제 해결 방법이 안떠올라 멘붕하기

왜냐면 맨날 문제 풀다가 정렬이 필요한 경우 자바에서 지원해주는 Arrays.sort() 메서드를 사용했기 때문 ㅋㅋㅋㅋ

2.  정렬 하기

nlog(n)의 기댓값을 갖는 퀵정렬은 구현하기 힘드니(?) 선택/버블/삽입 정렬 중 선택한다.

(개인적으로 선택 정렬이 제일 외우기 쉬우니 선택 정렬로 구현)

3. 정렬 조건에 문자열을 기준으로 할지 선택한다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public String[] solution(String[] strings, int n) {
        String[] answer = {};
        int min;
        String temp;
        //선택 정렬 구현하기
        for(int i=0; i<strings.length-1; i++) {
            min = i;
            for(int j=i+1; j<strings.length; j++) {
                //비교해서 가장 작은 값을 찾는다.
                System.out.println(" "+strings[min].substring(n, n+1)+" vs "+strings[j].substring(n, n+1));
                if(strings[min].substring(n, n+1).compareTo(strings[j].substring(n, n+1))>0) {
                    min = j;
                }
                //n번째 문자까지 같다면 걍 문자 비교하기
                else if(strings[min].substring(n, n+1).compareTo(strings[j].substring(n, n+1))==0) {
                    if(strings[min].compareTo(strings[j])>0) {
                        min = j;
                    }
                }
              }
            //min값을 i번째와 바꾼다.
            temp = strings[i];
            strings[i] = strings[min];
            strings[min] = temp;
        }
        
        for(String k : strings) {
            System.out.println(k);
        }
        return strings;
    
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        programmers_SuitMyselfSort s = new programmers_SuitMyselfSort();
        
        String[] strings = {"sun","bed","car"};//{"abce","abcd","cdx"};
        int n = 1;
        
        s.solution(strings, n);
 
    }
cs


풀고 보니 어려운게 아니고 정리할 것도 딱히 없어보인 문제

해결방법이 갑자기 안떠올라서 ㅠㅠ 

어쨋거나 정렬이 안떠올랐다는건 기본기가 부족하다는 것이니, 다시 복습하는 시간을 가져야 겠습니다.


각 정렬 알고리즘 구현 하는 시간을 가져봐야겠네요.





+ Recent posts