문자열로 구성된 리스트 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"]
입출력 예 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"] 입니다.
문제 풀이
어떤 방법으로 문제에 접근해야할지(compare 메서드를 재정의, temp 임시 변수를 선언해서 값을 바꿔주기) 고민했다.
temp 변수로 하루종일 하다가 막혀서 결국 메서드를 재정의해보기로함..
두 매개변수를 비교할 것이므로 Comparator 를 import 해서 compare 메서드를 재정의한다.
두 문자열의 n번째 글자를 기준으로 비교한다.
첫 번째 인자가 두 번째 인자보다 크면 양수를 반환, 같으면 0을 반환, 작으면 음수를 반환하게끔한다.
재정의한 compare로 strings를 정렬
import java.util.Arrays;
import java.util.Comparator;
class Solution {
public String[] solution(String[] strings, int n) {
String[] answer = new String[strings.length];
Comparator<String> comp = new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
if(s1.charAt(n) > s2.charAt(n)) {
return 1;
} else if(s1.charAt(n) < s2.charAt(n)) {
return -1;
} else {
return 0;
}
}
};
Arrays.sort(strings);
Arrays.sort(strings, comp);
return strings;
}
}
n번째 인덱스 문자가 같다면 compareTo를 사용해서 두 문자열의 포함관계를 알아야한다.
예) {"abcd","abc"}이고 n이 1일 경우, "b"로 같으므로 else if 부분을 타게된다.
"abcd"가 "abc"를 포함한다면, "abc", "abcd"순으로 정렬해주어야하므로 temp 변수를 통해 자리를 바꾼다.
회고
다른 사람들의 풀이를 통해 comparing()을 사용하면 간단하게 원소들을 비교하여 정리할 수 있음을 알았다. (Java 8이후부터 사용 가능)
문제 1
문제
문자열 내 마음대로 정렬하기 (https://school.programmers.co.kr/learn/courses/30/lessons/12915)
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
제한 조건
입출력 예
입출력 예 1
입출력 예 2
문제 풀이
어떤 방법으로 문제에 접근해야할지(compare 메서드를 재정의, temp 임시 변수를 선언해서 값을 바꿔주기) 고민했다. temp 변수로 하루종일 하다가 막혀서 결국 메서드를 재정의해보기로함..
temp 변수를 사용해서도 풀어보았다
n번째 인덱스 문자가 같다면 compareTo를 사용해서 두 문자열의 포함관계를 알아야한다. 예) {"abcd","abc"}이고 n이 1일 경우, "b"로 같으므로 else if 부분을 타게된다. "abcd"가 "abc"를 포함한다면, "abc", "abcd"순으로 정렬해주어야하므로 temp 변수를 통해 자리를 바꾼다.
회고
다른 사람들의 풀이를 통해
comparing()
을 사용하면 간단하게 원소들을 비교하여 정리할 수 있음을 알았다. (Java 8이후부터 사용 가능)n번째 인덱스 글자(s.substring(n, n+1))를 기준으로 바로 정렬한 코드이다.
유연하게 사고하기가 어렵다. 여러 개념들을 찾아보고 문제도 많이 풀어봐야겠다.