https://school.programmers.co.kr/learn/courses/30/lessons/12915
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
비교하는 문자를 기존 문자열 앞에 붙여서 정렬하는 방식
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]);
}
Collections.sort(list);
for(int i = 0; i < answer.length; i++){
answer[i] = list.get(i).substring(1);
}
return answer;
}
}
1. n에 해당하는 인덱스의 문자를 문자열 앞에 붙여준다.
2. 문자열을 정렬한다.
3. 앞에 붙여준 문자를 제외하여 리턴한다.
Comparator를 사용하여 정렬
import java.util.*;
class Solution {
public String[] solution(String[] strings, int n) {
Arrays.sort(strings, (s1, s2) -> {
if (s1.charAt(n) != s2.charAt(n)) {
return s1.charAt(n) - s2.charAt(n);
}
return s1.compareTo(s2);
});
return strings;
}
}
책에서 나온 코드인데, 시간복잡도나 코드길이나 전부 뛰어났다.
Arrays.sort(strings, (s1, s2) -> s1.charAt(n) - s2.charAt(n));
단순히 이런식으로 비교를 하게 되면, 인덱스의 문자가 동일한 경우를 걸러내지 못한다.
그렇기 때문에, 만약 문자가 동일하다면 compareTo()를 사용하여 비교해주면 된다.
CompareTo
String s1 = "abfk"
String s2 = "abmz";
int diff = s1.compareTo(s2);
compareTo() 메서드는 문자열 간의 차이를 계산한다. 비교대상의 문자열의 첫번째 문자부터 하나씩 비교를 하는데, 위 예제와 같은 경우는 "a", "b"가 동일하므로 "f", "m"을 비교하게 되는데 f의 ASCII 값은 102, m은 107이므로 결과값은 -7이 된다.
프로그래머스 문제에서도 "abce", "abcd"를 비교해보자.
String s1 = "abce";
String s2 = "abcd";
System.out.println(s1.compareTo(s2)); // 1
e가 d보다 ASCII코드가 1더 크기 때문에, 결과값이 1이 출력된다.
따라서, 문제에서 s1.compareTo(s2)를 할 때 ASCII 코드가 더 작은 값이 앞으로 정렬되기 때문에 성공적으로 사전순으로 정렬할 수 있다!
'Algorithm > 프로그래머스 코딩테스트 문제풀이전략' 카테고리의 다른 글
[프로그래머스] Lv.2 메뉴 리뉴얼 (0) | 2024.05.03 |
---|---|
[프로그래머스] Lv.2 가장 큰 수 (0) | 2024.05.02 |
[프로그래머스] Lv.1 문자열 내림차순으로 배치하기 (0) | 2024.05.02 |
[프로그래머스] Lv.2 H-index (0) | 2024.05.02 |
[프로그래머스] Lv.1 두 개 뽑아서 더하기 (0) | 2024.05.02 |