-
[백준 알고리즘/Kotlin] 1157번 단어 공부 (feat. maxOrNull, count, indexOf)IT Study/백준 알고리즘 2023. 12. 27. 14:15728x90
이번 글에서는 Kotlin을 이용해 문자열에서 가장 빈도수가 높은 알파벳을 찾는 방법에 대해 알아보겠습니다.
이 문제는 대소문자를 구분하지 않고, 가장 빈도수가 높은 알파벳이 여러 개인 경우 '?'를 출력하는 것이 특징입니다.
최종 코드와 함께 사용된 주요 메서드를 보도록 하겠습니다.
최종 코드
fun main() = System.`in`.bufferedReader().use { br -> val word = br.readLine().uppercase() val counts = IntArray(26) for (char in word) { counts[char - 'A']++ } val max = counts.maxOrNull() val maxCount = counts.count { it == max } if (maxCount > 1) { println("?") } else { println((counts.indexOf(max!!) + 'A'.code).toChar()) } }
1. 빈도 수 계산
for (char in word) { counts[char - 'A']++ }
counts[char - 'A']++에서는 각 알파벳의 빈도수를 계산하여 counts 배열에 저장합니다.
여기서 'A'를 빼는 이유는 알파벳을 ASCII 코드로 변환한 후 0부터 시작하는 인덱스를 얻기 위함입니다.
2. 최빈값 찾기
val max = counts.maxOrNull() val maxCount = counts.count { it == max } if (maxCount > 1) { println("?") } else { println((counts.indexOf(max!!) + 'A'.code).toChar()) }
val max = counts.maxOrNull()에서는 가장 빈도수가 높은 알파벳을 찾습니다.
val maxCount = counts.count { it == max }에서는
그 빈도수와 동일한 빈도수를 가진 알파벳이 몇 개인지 세어 maxCount에 저장합니다.
만약 maxCount가 1보다 크다면 가장 빈도수가 높은 알파벳이 여러 개 있으므로 '?',
그렇지 않다면 해당 알파벳을 출력합니다.2-1. maxOrNull 메서드
maxOrNull 메서드는 컬렉션 내의 가장 큰 요소를 반환합니다. 만약 컬렉션이 비어있으면 null을 반환합니다.
이름처럼 정말 직관적이죠?
val numbers = listOf(1, 2, 3, 4, 5) val max = numbers.maxOrNull() // 결과: 5 val empty = emptyList<Int>() val maxInEmpty = empty.maxOrNull() // 결과: null
2-2. count 메서드
count 메서드는 컬렉션 내 요소 개수를 반환하거나, 주어진 조건에 맞는 요소의 개수를 반환합니다.
val numbers = listOf(1, 2, 3, 4, 5) val count = numbers.count() // 결과: 5 val evenCount = numbers.count { it % 2 == 0 } // 결과: 2
2-3. indexOf 메서드
indexOf 메서드는 주어진 요소의 첫 번째 인덱스를 반환합니다.
만약 주어진 요소가 리스트에 없다면, 이 함수는 -1을 반환합니다.
val numbers = listOf(1, 2, 3, 4, 5) val indexOfThree = numbers.indexOf(3) // 결과: 2 val indexOfSix = numbers.indexOf(6) // 결과: -1
마무리
간단하지만 반드시 알아야 할 메서드들을 확인했습니다.
이 메서드들을 잘 활용하면 보다 간결하고 효율적인 코드를 작성할 수 있습니다.
Kotlin의 다른 메서드들에 대해서도 계속 알아보도록 하겠습니다 :)
'IT Study > 백준 알고리즘' 카테고리의 다른 글
[백준 알고리즘/Kotlin] 2563번 색종이 (feat. 2차원 배열 2) (0) 2023.12.31 [백준 알고리즘/Kotlin] 2738번 행렬 덧셈 (feat. 2차원 배열) (0) 2023.12.31 [백준 알고리즘/Kotlin] 2588번 곱셈 (feat. toString() 이후 toInt() 사용) (0) 2023.12.26 [백준 알고리즘/Kotlin] 10869번 사칙연산 (feat. 입출력, append 체이닝) (1) 2023.12.26 [백준 알고리즘/Kotlin] 4673번 셀프 넘버 (feat. Array의 fill과 초기화 람다 차이) (0) 2023.12.25