문자열 내 마음대로 정렬하기 (Level 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의 문자가 같은 문자열이 여럿 일 경우, 사전 순으로 앞선 문자열이 앞쪽에 위치합니다.
입출력 예
입출력 예 설명
입출력 예 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"]입니다.
작성 코드
import java.util.*;
class Solution {
public ArrayList<String> solution(String[] strings, int n) {
Map<String, Character> map = new TreeMap<>();
for (int i = 0; i < strings.length; i++) {
map.put(strings[i], strings[i].charAt(n));
}
ArrayList<String> list = new ArrayList<>(map.keySet());
Collections.sort(list, (o1, o2) -> (map.get(o1).compareTo(map.get(o2))));
return list;
}
}
코드 설명
사전 순으로 앞선 문자열이 앞쪽에 위치한다고 하여 treemap과 arraylist를 사용하면 될 것 같았다. 그리고 기존에 반환 타입은 String [] 배열이었지만 ArrayList에서 다시 배열에 넣기 그래서 그냥 반환 타입을 바꾸었다.
처음엔 n번째 인덱스 값을 키값으로 넣으려고 했지만 map은 키의 중복 값이 있으면 추가하지 않는다. 그래서 문자열을 key로 하고, n번째 인덱스에 있는 문자를 value로 지정해주었다. (5~8번 라인)
그 후 map의 keySet() 메서드를 활용하여 list안에 key 값을 넣었다. 이제 value 값을 기준으로 정렬하여 해당 값들을 반환하면 되는데... 아무리 해도 모르겠다... 결국 방법을 모르겠어서 결국 검색했다! 그래서 찾은 코드가 바로 11번 라인에 있는 코드이다. 아래 코드를 사용하면 map의 값을 기준으로 정렬할 수 있다.
다른 사람의 풀이
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;
}
}
map을 사용하지 않고서도 기준 문자열을 맨 앞에 붙여서 sort 시키면 된다니... 그걸 다시 배열에 순차적으로 넣어주면서 substring메서드를 통해 앞에 붙여준 문자를 빼고 넣는 다라.. 왜 이런 생각을 못했을까요 ㅠㅠ 아무튼 대단한 사람이 너무나 많다