반응형
문제 출처 : https://www.acmicpc.net/problem/1181
문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로입력
- 첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
- 출력
- 조건에 따라 정렬하여 단어들을 출력한다. 단, 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력한다.
알고리즘 분류
풀이
Kotlin의 Collection 정렬 커스텀을 익히기 위해 푼 문제다.
정렬 커스텀은 c++에서도 종종 했지만, 생으로 메모장에 쓰라면 틀릴 것 같기 때문에,
완전히 익힐 때까지 비슷한 문제를 풀어보는 것이 좋을 것 같다.
풀이는 중복을 없애기 위해 set의 자료구조를 사용했으며,
정렬 조건을 커스텀 하여 단어의 길이 순 오름차순, 길이가 같으면 사전 순 오름차순으로 정렬하였다.
코드1(Kotlin)
import java.io.BufferedReader
import java.io.InputStreamReader
fun main() = with(System.out.bufferedWriter()) {
val br = BufferedReader(InputStreamReader(System.`in`))
// val path = "C:\\Kotlin\\HelloKotlin\\app\\src\\main\\java\\com\\example\\hellokotlin\\input.txt"
// val br = File(path).bufferedReader()
var t = Integer.parseInt(br.readLine())
val set = mutableSetOf<String>()
for (i in 0 until t) {
set.add(br.readLine())
}
val resultSet = set.sortedWith(Comparator { a, b ->
when {
a.length < b.length -> -1
a.length == b.length -> when {
a < b -> -1
else -> 1
}
else -> 1
}
})
for (item in resultSet) {
write("$item\n")
}
close()
}
코드2(c++)
#include <set>
#include <iostream>
#include <string>
using namespace std;
struct Cmp {
bool operator()(const string &a,const string &b) const{
if (a.length() == b.length()) {
return a < b;
}
return a.length() < b.length();
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
set<string,Cmp> se;
while (t--) {
string str;
cin >> str;
se.insert(str);
}
for (auto o : se) {
cout << o << '\n';
}
}
반응형
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 1167 트리의 지름 Kotlin (dfs) (0) | 2021.08.18 |
---|---|
백준 1043 거짓말 Kotlin (유니온파인드) (0) | 2021.08.17 |
백준 1107 리모컨 Kotlin (완전탐색) (0) | 2021.08.16 |
백준 1074 Z Kotlin (재귀,분할 정복) (0) | 2021.08.16 |
백준 22252 정보 상인 호석 c++,Kotlin(해시,우선순위 큐) (0) | 2021.08.13 |
댓글