본문 바로가기
Algorithm/프로그래머스

[프로그래머스]연습문제 : 문자열 내 마음대로 정렬하기 (level 1)

by HBGB 2019. 11. 6.

https://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이하인

programmers.co.kr

 

 

 

방법 1: 맨 처음에 낸 답안

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
import java.util.Arrays;
import java.util.Comparator;
 
class Solution {
    public String[] solution(String[] strings, int n) {
 
        Arrays.sort(strings, new Comparator<String>() {
 
            @Override
            public int compare(String o1, String o2) {
                
                // n번째 문자를 기준으로 오름차순 정렬
                int result = (o1.charAt(n) + "").compareTo(o2.charAt(n) + "") ;
                
                // n번째 문자가 일치한다면, 문자열 전체를 기준으로 오름차순 정렬
                if (result == 0) {
                    return o1.compareTo(o2);
                }
                
                return result;
            }
        });
        
        return strings;
    }
}
Colored by Color Scripter

 

방법 2:  아이디어에 감명받은 다른 분 답안

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.*;
 
class Solution {
    public String[] solution(String[] strings, int n) {
 
        // 배열 각 요소의 n번째 자리를 앞에붙여 list에 추가
        ArrayList<String> arr = new ArrayList<>();
        for (int i = 0; i < strings.length; i++) {
            arr.add("" + strings[i].charAt(n) + strings[i]);
        }
 
        // 오름차순 정렬
        Collections.sort(arr);
 
        // 정렬된 list -> int배열
        String[] 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;
    }
}
Colored by Color Scripter

 

방법 3: 방법 2에 영감을 받아서 방법1을 수정한 답안

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.Arrays;
import java.util.Comparator;
 
class Solution {
    public String[] solution(String[] strings, int n) {
 
        Arrays.sort(strings, new Comparator<String>() {
 
            @Override
            public int compare(String o1, String o2) {
 
                // n번째 문자를 맨 앞에 붙인 문자열로 오름차순 정렬
                return (o1.charAt(n) + o1).compareTo(o2.charAt(n) + o2);
            }
        });
        
        return strings;
    }
}
 
Colored by Color Scripter

 

방법1이 가장 빠르고, 방법2 와 3이 비슷하다.

방법 3은 보기엔 깔끔하지만 속도는 떨어지는 것 같다. 

 

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

방법 2를 구현하신 분은 이 문구를 잘 응용한 것이다. 

 

n번째 문자 -> 전체문자 순으로 우선순위를 가지니, 

아예 n번째 문자를 문자열 맨 앞에 붙여버리기... o u ya

댓글