https://www.acmicpc.net/problem/1181
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
난이도 : 실버 5
태그 : 문자열, 정렬
설명
같은 문자는 제거하면서, 길이 순으로 정렬하고, 길이가 같을 땐 사전 순으로 정렬하는 문제입니다.
코틀린, 코딩테스트 둘 다 공부를 시작한지 얼마 안됬을 때 풀었던 문제였던 것 같은데,
옛날에 꽤나 치열하게 풀었더군요...
소스코드
1년 전 코드
fun main() {
val case = readLine()!!.toInt()
var arr = ArrayList<String>()
for (i in 0 until case)
arr.add(readLine()!!)
arr.sortBy { it.length } //길이순 정렬
var i = 0
while (i < arr.size) {
var cnt = 1
for (j in i until arr.size - 1) {
if (arr[j].length == arr[j + 1].length)
cnt++
else
break
}
var temp = Array(cnt) { "" }
for ((idx, j) in (i until i + cnt).withIndex())
temp[idx] = arr[j]
temp.sort()
temp = temp.distinct().toTypedArray()
for (j in temp.indices) {
println(temp[j])
}
i += cnt
}
}
길이 기준으로 정렬하는 것 까진 알았는데,
아무래도 복수 조건 정렬을 몰랐던 것 같습니다.
다시 푼 코드
fun main() = with(System.`in`.bufferedReader()) {
val n = readLine().toInt()
val words = Array(n) { readLine() }
words.distinct().sortedWith(compareBy({ it.length }, { it })).forEach { println(it) }
}
https://uknowblog.tistory.com/319
[Kotlin/코틀린] 여러 조건을 기준으로 정렬하기
개발을 하다보면 간혹가다가 배열 혹은 리스트를 정렬할 때, 여러 프로퍼티를 기준으로 정렬을 해야할 때가 있습니다. 아래와 같이 이름, 나이, 키, 몸무게를 프로퍼티로 가지는 Person 클래스가
uknowblog.tistory.com
지금은 여러 조건으로 정렬하는 방법을 알게되어 꽤나 짧아진 모습입니다.
단어들을 입력받은 뒤,
distinct()로 중복을 제거해주고,
sortedWith + compareBy로 다중 조건(1. 길이 2. 사전순) 정렬을 해준 뒤,
forEach로 출력하였습니다.
숏코딩
fun main()=Array(readln().toInt()) { readln() }.distinct().sortedWith(compareBy({ it.length }, { it })).forEach(::println)
함수의 바디가 1줄이면 중괄호를 생략할 수 있는 코틀린의 특징을 이용하면 사실 한 줄 코딩도 가능합니다.
가독성은 최악이지만요.
후기
구현능력 자체를 키우는 데에는 첫 번째 방법이 최고지만,
사용할 수 있는 도구가 있을 땐 도구를 활용하는 방법을 배우는 것도 좋지요.
새삼 함수형 프로그래밍의 간결함을 느낍니다.
'코딩테스트 > Kotlin' 카테고리의 다른 글
[백준 11508번] [Kotlin] 2+1 세일 (0) | 2023.11.24 |
---|---|
[백준 16496번] [Kotlin] 큰 수 만들기 (0) | 2023.11.24 |
[백준 4993번] [Kotlin] Red and Black (1) | 2023.11.20 |
[백준 17471번] [Kotlin] 게리맨더링 (1) | 2023.11.12 |
[백준 12869번] [Kotlin] 뮤탈리스크 (4) | 2023.11.10 |