프로그래머스 “문자열 내 마음대로 정렬하기” 문제 해결과정입니다.
문자열 내 마음대로 정렬하기
문제설명
문자열로 구성된 리스트 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"] |
문제 해결과정
프로그래머스 코드
import java.util.*;
class Solution {
public String[] solution(String[] strings, int n) {
String[] answer = new String[strings.length];
List<String> list = new ArrayList<>();
for(int i = 0; i < strings.length; i++) {
list.add(strings[i].charAt(n) + "," + strings[i]); // ex) "u,sun","e,bed","a,car"
}
System.out.println(list);
Collections.sort(list);
for(int i = 0; i < list.size(); i++) {
String a = list.get(i).split(",")[1];
answer[i] = a;
}
return answer;
}
}
먼저 리턴 할 answer의 배열 크기를 string.length로 설정해준다. 리스트를 선언하고 list.add(strings[i].charAt(n) + "," + strings[i]);로 string의 요소의 n번째 문자를 나타내는 형태로 리스트 안에 넣어준다. 이후에 Collections.sort를 통해 정렬해주고 반복문으로 “,” 뒤에 있는 것을 반환받아(split(“,”)[1]) answer에 넣어준다.
한 줄 코드
import java.util.*;
class Solution {
public String[] solution(String[] strings, int n) {
return Arrays.stream(strings)
.sorted((s1, s2) -> {
int cmp = Character.compare(s1.charAt(n), s2.charAt(n));
return cmp != 0 ? cmp : s1.compareTo(s2);
})
.toArray(String[]::new);
}
}
배열의 요소를 스트림으로 변환(Arrays.stream(strings))하고 정렬(sort) 하였다. sort 안에 람다식으로 s1과 s2를 Character.compare로 각 문자열의 n번째 문자를 비교하여 만약 둘 다 동일하면 0을 반환한다. s1의 문자가 s2의 문자보다 작으면 음수를, 크면 양수를 반환한다. 만약 0이 아니라면 cmp를 반환하여 정렬 순서를 결정하고, 0이면 compareTo로 s1,s2를 문자열의 사전 순서를 비교하여 반환한다. 마지막으로 .toArray(String[]::new);로 새 문자열 배열을 선언하며 배열 값을 리턴한다.
사용된 메소드
| 메소드 | 설명 |
| List | 문자열을 저장할 ArrayList 생성 |
| list.add(strings[i].charAt(n) + “,” + strings[i]); | n번째 문자와 전체 문자열을 결합하여 리스트에 추가 |
| Collections.sort(list); | 리스트를 사전순으로 정렬 |
| String a = list.get(i).split(“,”)[1]; | 리스트의 요소를 ‘,’로 나누어 두 번째 부분(원래 문자열)을 가져옴 |
| Arrays.stream(strings) | 문자열 배열을 스트림으로 변환 |
| sorted((s1, s2) -> {…}) | 정렬 기준을 정의하는 람다 표현식 |
| Character.compare(s1.charAt(n), s2.charAt(n)); | 두 문자열의 n번째 문자를 비교 |
| s1.compareTo(s2); | n번째 문자가 동일할 경우, 사전순으로 두 문자열을 비교 |
| toArray(String[]::new); | 스트림의 결과를 새로운 문자열 배열로 변환 |