# 문제 출제 사이트
https://www.acmicpc.net/problem/1181
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
# 문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
# 입력
첫째 줄에 단어의 개수 N이 주어진다.
(1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다.
주어지는 문자열의 길이는 50을 넘지 않는다.
# 출력
조건에 따라 정렬하여 단어들을 출력한다.
단, 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력한다.
# 제출한 소스코드
더보기
1. 글자수에 맞게 정렬되고 중복은 제거 되었지만, 길이가 같으면 사전순으로 정렬해야하는데 못한 것
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedHashSet;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] strArr = new String[n];
int[] numArr = new int[n];
for ( int i = 0; i < n; i++ ) {
String tempStr = br.readLine();
strArr[i] = tempStr;
numArr[i] = tempStr.length();
}
for ( int j = 0; j < n; j++ ) {
for ( int k = 0; k < n; k++ ) {
if ( numArr[j] < numArr[k] ) {
int tempNum = numArr[k];
numArr[k] = numArr[j];
numArr[j] = tempNum;
String tempStr = strArr[k];
strArr[k] = strArr[j];
strArr[j] = tempStr;
}
}
}
LinkedHashSet<String> hashSet = new LinkedHashSet<>(List.of(strArr));
for ( String str : hashSet ) {
System.out.println(str);
}
}
}
- 1시간 가량 고민하다가 결국 제출했는데 글자수에 맞게 정렬하고 중복도 제거했지만 하나의 조건을 못 맞췄다.
- 결국 오늘도 Stranger's LAB 블로그를 보고 아래의 방식대로 문제를 풀게 되었다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] strArr = new String[n];
for ( int i = 0; i < n; i++ ) {
strArr[i] = br.readLine();
}
Arrays.sort(strArr, new Comparator<String>() {
@Override
public int compare(String str1, String str2) {
if ( str1.length() == str2.length() ) {
return str1.compareTo(str2);
} else {
return str1.length() - str2.length();
}
}
});
LinkedHashSet<String> hashSet = new LinkedHashSet<>(List.of(strArr));
for ( String str : hashSet ) {
System.out.println(str);
}
}
}
- Arrays.sort 에 Compare 함수를 Override 해서 사용할 방법은 진짜 생각도 못했다.
* Stranger's LAB의 블로그를 보고 해당 코드를 작성했다. - 위 코드는 LinkedHashSet을 사용해서 중복된 글자를 제거했다.
- HashSet을 사용해서 중복을 제거할려고 했지만 순서가 뒤바뀌었다.
=> HashSet과 LinkedHashSet의 차이점 => 링크
- HashSet을 사용해서 중복을 제거할려고 했지만 순서가 뒤바뀌었다.
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 n = Integer.parseInt(br.readLine());
String[] strArr = new String[n];
for ( int i = 0; i < n; i++ ) {
strArr[i] = br.readLine();
}
Arrays.sort(strArr, new Comparator<String>() {
@Override
public int compare(String str1, String str2) {
if ( str1.length() == str2.length() ) {
return str1.compareTo(str2);
} else {
return str1.length() - str2.length();
}
}
});
System.out.println(strArr[0]);
for ( int j = 1; j < strArr.length; j++ ) {
if ( !(strArr[j].equals(strArr[j - 1])) ) {
System.out.println(strArr[j]);
}
}
}
}
- 굳이 LinkedHashSet 을 사용해서 정렬할 필요가 없었다.
j 인덱스의 글자와 j - 1 인덱스의 글자가 같으면 출력을 안하면 되는 것이었다.
# 참고자료
- 블로그 Stranger's LAB => 링크
반응형