[문제]
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다.
예를 들어 strings가 [sun, bed, car]이고 n이 1이면 각 단어의 인덱스 1의 문자 u, e, a로 strings를 정렬합니다.
[내 풀이]
아래 다른 사람 풀이는 생각도 못했다. 문제의 풀이에만 초점을 맞춘 효율적인 방법이다. 정렬해야 할 자리의 문자를 맨 앞에 붙인 뒤, 정렬하고 맨 앞의 문자를 잘랐다.
반면, 내 풀이는... 문자 배열의 정렬해야 할 자리의 문자를 키 값으로 두었다. 이때, 동일한 자리가 있을 수 있으므로 Value는 List로 만들어 MultiValue가 가능하도록 만들었다.
그 뒤, 먼저 키 값 순서대로 정렬하고 Value가 여러 값이 있다면 또 순서대로 정렬한다.
import java.util.*;
class Solution {
public String[] solution(String[] strings, int n) {
String[] answer = new String[strings.length];
Map<String, List<String>> multiMap = new HashMap<>();
List<String> list = new ArrayList<>();
for (String str : strings){
String word = str.substring(n, n + 1);
if (multiMap.containsKey(word)){
list = multiMap.get(word);
list.add(str);
} else {
list = new ArrayList<>();
list.add(str);
}
multiMap.put(word, list);
}
List<String> collect = multiMap.keySet().stream().sorted().collect(Collectors.toList());
int i=0;
for (String key : collect){
List<String> values = multiMap.get(key).stream().sorted().collect(Collectors.toList());
for (String value : values) answer[i++] = value;
}
return answer;
}
}
[다른 사람 풀이 참고]
import java.util.*;
class Solution {
public String[] solution(String[] strings, int n) {
String[] answer = {};
ArrayList<String> arr = new ArrayList<>();
for (int i = 0; i < strings.length; i++) {
arr.add("" + strings[i].charAt(n) + strings[i]);
}
Collections.sort(arr);
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;
}
}
<문제 출처>
programmers.co.kr/learn/courses/30/lessons/12915
'JAVA > Argorithm Test' 카테고리의 다른 글
# Level 1 - 시저 암호 (0) | 2020.11.23 |
---|---|
#Level 1 - 소수 찾기 (0) | 2020.11.20 |
# level-1 카카오 블라인드 - 1차 다트 게임 (0) | 2020.11.10 |
# Level1 - 정렬 - K번째 수 (0) | 2020.11.09 |
# Level 1 - 2020카카오 인턴십 키패드 누르기 (0) | 2020.11.06 |