본문 바로가기
Computer/Algorithm_Java

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

by HJ0216 2023. 9. 22.
 

프로그래머스

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

programmers.co.kr

 

Language: Java

 

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
import java.util.Arrays;
import java.util.Comparator;
 
class Solution {
    public String[] solution(String[] strings, int n) {
        
        // 1. 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬
        // 2. 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순 정렬
        
        String[] answer = {};
        
        Arrays.sort(strings, new Comparator<String>() {
            
            public int compare(String s1, String s2) {
                int result = Integer.compare(s1.charAt(n), s2.charAt(n));
                if (result == 0) {
                    result = s1.compareTo(s2);
                }
                return result;
            };
            
        });
        
        return strings;
    }
}
 
 

🤔 해설

1. new Comparator<String>() { ... }

    - 정렬 기준 Overriding

2. int result = Integer.compare(s1.charAt(n), s2.charAt(n));

    - index위치에 따른 1차 비교

3. if (result == 0) { ... }

    - 사전순 2차 비교

 

😮  외의 풀이

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
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
 
class Solution {
        public String[] solution(String[] strings, int n) {
        
        // 1. 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬
        // 2. 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순 정렬
        
        String[] answer = {};
 
        List<String> list = new ArrayList<>();
        for (int i = 0; i < strings.length; i++) {
            list.add(strings[i].charAt(n) + strings[i]);
        }
        
        Collections.sort(list);
        answer = new String[list.size()];
        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i).substring(1, list.get(i).length());
        }
        
        return answer;
    }
}
 
 

1. list.add(strings[i].charAt(n) + strings[i]);

    - 1차 정렬대상을 문자열 앞에 추가

2. answer[i] = list.get(i).substring(1, list.get(i).length());

    - 결과값 return 전 추가한 문자열 제거

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
    public String[] solution(String[] strings, int n) {
      
    // 1. 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬
    // 2. 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순 정렬
      
    List<String> list = Arrays.asList(strings);
        
    list.sort((a, b) -> {
        int result = (a.split(""))[n].compareTo((b.split(""))[n]);
        
        if(result == 0)
            return a.compareTo(b);
        
        return result;
    });
        
    return list.toArray(new String[0]);
 
  }
}
 
 

1. List<String> list = Arrays.asList(strings);

    - List → Arrays

2. int result = (a.split(""))[n].compareTo((b.split(""))[n]);

    - 문자열을 문자 단위로 쪼개서 배열로 변환

3. return list.toArray(new String[0]);

    - Arrays → List

    - new String[0]: 매개변수로 배열의 타입을 지정

    - toArray: List의 크기에 따라 필요한 크기의 새 배열을 생성

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

프로그래머스

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

programmers.co.kr