● 문제
● 풀이
먼저, 문자를 입력받아, 배열에 넣은 후 길이순으로 정렬을 한 다음, 길이가 같다면 사전순으로 정렬한다.
길이순으로 정렬하는 방식은 아래와 같다.
String[] arr = new String[N];
for(int i =0; i<N; i++){
arr[i] = in.nextLine();
}
Arrays.sort(arr, Comparator.comparing(String::length));
길이가 같다면 사전순으로 정렬할 때, 같은 각 단어의 0번 인덱스끼리 비교, 1번 인덱스끼리 비교해가는 순으로 해야한다.
아니다, 문자열 배열에서 Arrays.sort()를 통해 사전순으로 정렬할 수 있다.
하나 더, 중복된 단어는 하나만 남기고 제거해야한다. 이는 길이가 같다면, 끝까지 비교해서 문자열이 같으면 하나는 없애걸로 하면 될라나 ? 아니다! 출력할때 앞뒤비교만 하면 되는거시다.
중간 코드
import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
class Main {
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
in.nextLine();
String[] arr = new String[N];
for(int i =0; i<N; i++){
arr[i] = in.nextLine();
}
Arrays.sort(arr);
Arrays.sort(arr, Comparator.comparing(String::length));
for(int i =0; i<N; i++){
System.out.println(arr[i]);
}
}
}
길이, 사전순대로 정렬하였고, 이제 중복되면 삭제하는 코드를 추가해야된다.
길이가 같으면 하나씩 비교해가며 같으면 삭제하는 알고리즘은 너무 코드가 복잡할듯하여
지피티에게 물어보았다.
● 최종 코드 !!
중복인지 체크하는 코드는 마지막에 출력할 때,
arr[0]를 일단 출력 후, arr[1]부터 arr[i]와 arr[i-1]를 비교하면 된다.
arr[0]를 먼저 출력하는 이유는, arr[0]과 arr[0-1]를 비교해야하는데, 그럼 인덱스범위오류가 나기 때문.
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
String[] arr = new String[N];
for(int i =0; i<N; i++){
arr[i] = in.next();
}
Arrays.sort(arr);
Arrays.sort(arr, Comparator.comparing(String :: length));
System.out.println(arr[0]);
for(int i =1; i<N; i++){
if(!arr[i].equals(arr[i - 1])){
System.out.println(arr[i]);
}
}
}
}
Arrays.sort(arr, Comparator.comparing(String::length))는 배열 arr을 문자열의 길이를 기준으로 정렬하는 코드입니다.
Comparator.comparing() 메서드는 주어진 키 추출 함수를 기반으로 Comparator를 생성하는 정적 메서드입니다. 여기서는 String::length를 키 추출 함수로 사용하였습니다. String::length는 String 객체의 길이를 반환하는 메서드 참조입니다.
Comparator.comparing(String::length)는 문자열의 길이를 기준으로 비교하는 Comparator를 생성합니다. 이 Comparator는 문자열의 길이를 비교하여 정렬하는 역할을 합니다.
Arrays.sort() 메서드는 배열을 정렬하는 메서드로, 첫 번째 인자로 정렬할 배열을 받고, 두 번째 인자로 정렬에 사용할 Comparator를 받습니다. 이 코드에서는 Comparator.comparing(String::length)를 두 번째 인자로 전달하여 배열 arr을 문자열의 길이를 기준으로 정렬합니다.
결과적으로, arr 배열은 문자열의 길이가 짧은 순서대로 정렬됩니다.
10814 나이순 정렬을 풀며 제대로 Comparator에 대해 개념공부를 하여 단어 정렬또한 내가 더 이해하기 쉬운 코드로 다시 풀어보았음.
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
String[] arr = new String[N];
for(int i =0; i<N; i++){
arr[i] = in.next();
}
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1.length() == o2.length()){
return o1.compareTo(o2);
}
return o1.length() - o2.length();
}
});
System.out.println(arr[0]);
for(int i =1; i< N; i++){
if(!arr[i].equals(arr[i - 1])){
System.out.println(arr[i]);
}
}
}
}
'백준' 카테고리의 다른 글
[백준] 1676 팩토리얼 0의 개수_ JAVA (0) | 2023.06.09 |
---|---|
[백준] 1436 영화감독 숌_ JAVA (2) | 2023.06.09 |
[백준] 10989 수 정렬하기 3_ JAVA (0) | 2023.06.08 |
[백준] 2775 부녀회장이 될테야_ JAVA (0) | 2023.06.06 |
[백준] 1259 펠린드롬수_ JAVA (0) | 2023.06.05 |