티스토리 뷰
keyword : 정렬, Comparator
difficulty : 실버5
completion : ✅
notice :
단어정렬
📝 문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
입력
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
출력
조건에 따라 정렬하여 단어들을 출력한다. 단, 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력한다.
예제 입력 1 복사
13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yours
예제 출력 1 복사
i
im
it
no
but
more
wait
wont
yours
cannot
hesitate알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
입력
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
출력
조건에 따라 정렬하여 단어들을 출력한다. 단, 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력한다.
예제 입력 1
13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yours
예제 출력 1
i
im
it
no
but
more
wait
wont
yours
cannot
hesitate
🔍 정답
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
Set<String> set = new HashSet<>();
for (int i = 0; i < N; i++) {
set.add(br.readLine());
}
ArrayList<String> array = new ArrayList<>(set);
Collections.sort(array);
for (int i = 1; i < 51; i++) {
for (int j = 0; j < array.size(); j++) {
if (toChar(array.get(j)) == i) {
sb.append(array.get(j) + "\n");
}
}
}
System.out.println(sb);
}
public static int toChar(String str) {
char[] ch = str.toCharArray();
return ch.length;
}
}
- 중복제거를 위해 Set을 이용해서 받았고 정렬을 하기 위해 ArrayList로 변환한 후 정렬하였다.
- array = 중복이 제거되어 오름차순으로 정렬됨
- toChar메소드는 문자열의 길이를 반환한다.
- 문자열의 길이(i) = 1부터 시작해서 array 배열에 i와 같은 길이가 있으면 sb에 차례로 담아주고 sb를 출력한다.
- 이 짓을 50번 반복한다^^
- 2차원 배열을 이용해서 풀었는데 다른 사람들 풀이에 비해 메모리는 5배 이상 잡아먹고 시간도 2배 이상 걸렸다...^^
<다른 사람 풀이>
참고사이트
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
String[] arr = new String[num];
for(int i = 0 ; i < num ; i++) {
arr[i] = br.readLine();
}
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
if(s1.length() == s2.length()) {
return s1.compareTo(s2);
}else {
return s1.length() - s2.length();
}
}
});
System.out.println(arr[0]);
for(int i = 1; i < num; i++) {
if (!arr[i].equals(arr[i - 1])) {
System.out.println(arr[i]);
}
}
}
}
- Arrays.sort는 기본적으로 인자를 2가지를 받는다.
- Array.sort(arr, new Comparator <>)
- 보편적으로 배열을 정렬할 때는 Array.sort(arr) 이런 식으로 인자를 1개만 줄 경우 Comparator은 default값으로 적용되어 실행이 되는 것
- 정수 정렬할 때는 default값으로 진행해도 무리가 없음
- 그러나 문자열을 정렬하기 위해서는 따로 재정의가 필요
Arrays.sort()의 Comparator 재정의하기
Arrays.sort(arr, new Comparator<String>() {
});
- 인자를 넣어줄 때 Comparator객체를 생성하여 넣어줌
Comparator에 있는 메서드인 compare 오버 라이딩하기
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
}
});
- 여기서 String s1과 s2는 무엇을 의미하냐면 앞서 우리가 인자로 주었던 arr의 배열이 0 1 // 1 2 // 2 3 이런 식의 인덱스가 들어가게 됨
문자열의 길이 정렬하기
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});
- 해당 메서드의 반환 값은 양수, 음수로 판단하여 정렬을 하며 해당 반환 값이 양수면 s1이 큰 값
문자열 길이가 같다면 사전 순으로 정렬하기
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
if(s1.length() == s2.length()) {
return s1.compareTo(s2);
}else {
return s1.length() - s2.length();
}
}
});
- 조건문으로 길이가 같음을 판별해주고 compareTo를 통해서 해당 문자열을 쉽게 정렬할 수 있다.
- compareTo는 Comparator 내부에 있는 메서드로 String문자열을 사전 순으로 정렬해주는 기능을 한다.
중복 제거
System.out.println(arr[0]);
for(int i = 1; i < num; i++) {
if (!arr[i].equals(arr[i - 1])) {
System.out.println(arr[i]);
}
}
- 가장 앞에 있는 문자열은 그냥 출력을 해준 뒤 인덱스 1부터 그 이전 거와 문자열을 비교하여 같지 않다면 출력!
'알고리즘' 카테고리의 다른 글
[알고리즘] 한수(백준1065번), 자바(java), 실버4, 등차수열 (0) | 2022.11.05 |
---|---|
[알고리즘] 요세푸스 0(백준11866번) (0) | 2022.11.02 |
[알고리즘] 크로아티아 알파벳(백준2941번) (1) | 2022.10.23 |
[알고리즘] 평균은 넘겠지(백준4344번)_2차원 배열 (0) | 2022.10.20 |
[알고리즘] 소수찾기(백준1978번) (0) | 2022.10.19 |
- Total
- Today
- Yesterday
- Algorithm
- 형변환
- java
- 해시맵
- DP
- 자바bfs
- 자바dp
- 리액트
- 자바스크립트
- Comparator
- Spring
- SQLD
- 프로그래머스
- 타입스크립트
- 스프링부트
- 이분탐색
- 스프링
- 알고리즘
- Queue
- 자바트리
- 자바
- dfs
- 백준
- JavaScript
- BFS
- CS
- 정렬
- SQL
- JPA
- Nest
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |