728x90
반응형
문제: https://www.acmicpc.net/problem/1181
문제 접근
문제에 나온대로 다음과 같이 생각했습니다:
- 문자열을 담을 리스트를 생성한다. (만약 이미 list에 있는 단어면 넣지 않는다)
- 문자열이 짧은 것부터 오름차순으로 정렬 (길이가 같으면 사전순으로 정렬)
사실 처음에는 Map에 문자열과 문자열길이를 넣을까 했는데, 리스트로 선택했습니다. (이유는 정렬할 때 리스트가 더 쉬운 거 같아서 입니다.)
리스트 생성하고 오름차순으로 정렬하는 것까지는 쉬웠는데... 문자열 비교하는 함수 equals 말고는 도저히 생각이 안 나더라구요 ㅎㅎ;; 그래서 바로 구글에 문자열 사전순 비교하는 법 찾아봐서 코드를 완성했습니다 ㅋㅋ..
이번에 오답노트 느낌으로 정리하고 나중에 이 문제가 생각 안 날 때 한 번 다시 풀어봐야겠어요 ㅠㅠ
전체 코드
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
List<String> list = new ArrayList<>();
for(int i = 0; i < n; i++) {
String word = br.readLine();
if(list.contains(word)) continue; // 중복단어 방지
else list.add(word);
}
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
if(s1.length() > s2.length()) return 1;
else if(s1.length() < s2.length()) return -1;
else return s1.compareTo(s2);
}
});
for(String word : list) {
bw.write(word + "\n");
}
bw.close();
}
}
자바 리스트 정렬
기본적으로 오름차순으로 정렬할 때는 다음과 같이 사용합니다.
Collections.sort(list);
저는 문자열 리스트를 길이 순으로 정렬하고, 길이가 같으면 사전 순으로 정렬하기 위해서 다음과 같이 코드를 작성했습니다.
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
if(s1.length() > s2.length()) return 1;
else if(s1.length() < s2.length()) return -1;
else return s1.compareTo(s2);
}
});
- Collections.sort(list, comparator): list를 내 방식대로 정렬할 거라는 뜻입니다.
- new Comparator<String>() {...}: 그리고 문자열 비교 방법을 직접 정의합니다.
- compare(): Comparator은 인터페이스이므로 compare 함수를 통해 "어떻게 문자열을 비교할 것인지" 정의해줘야 합니다. 저는 다음과 같이 정의했습니다.
- s1의 문자열이 더 긴 경우: 1 리턴
- s2의 문자열이 더 긴 경우: -1 리턴
- 둘의 문자열 길이가 같은 경우: compareTo()를 통해 사전 순으로 정렬, 이때 compareTo는 유니코드 값을 기준으로 값을 비교한다. 즉, 내부적으로 각 문자의 char 값을 하나하나 비교한다.
다음은 compare(s1, s2)의 리턴값의 의미를 나타낸 표입니다.
compare 메서드는 반환값이 음수이면 앞의 값(s1)이 먼저, 양수면 뒤의 값(s2)이 먼저 정렬됩니다!
역시 이번에도 역시 부족하다는 것을 또 느끼게 되었습니다! ㅋㅋ
읽어주셔서 감사합니다.
728x90
반응형
'Java > 코딩테스트' 카테고리의 다른 글
[백준] 8958번: OX퀴즈 (JAVA) (1) | 2025.04.13 |
---|---|
[백준] 1427번: 소트인사이드 (JAVA) (1) | 2025.04.12 |
[백준] 2292번: 벌집 (JAVA) (0) | 2025.04.03 |
[백준] 2903번: 중앙 이동 알고리즘 (JAVA) (0) | 2025.04.03 |
[백준] 2720번: 세탁소 사장 동혁 (JAVA) (0) | 2025.04.03 |