본문 바로가기
스터디(beakjoon)

Kotlin] 백준 11282번 풀이

by 김마리님 2024. 5. 14.

https://www.acmicpc.net/problem/11282

 

더보기

이 문제는.. 한글 유니코드 규칙을 알고 있어야 한다.

한글의 유니코드는 다음과 같이 초, 중, 종성으로 나누어져있고, 각각의 위치에서 인덱스를 빼내어 유니코드를 도출하는 방식이다.

따라서 해당 인덱스를 찾아낸다면 어렵지 않다.

 

val firstList = arrayOf("ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ")
val secondList = arrayOf("ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ", "ㅖ", "ㅗ", "ㅘ", "ㅙ", "ㅚ", "ㅛ", "ㅜ", "ㅝ", "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ", "ㅣ")
val thirdList = arrayOf("", "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ", "ㄷ", "ㄹ", "ㄺ", "ㄻ", "ㄼ", "ㄽ", "ㄾ", "ㄿ", "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ")

한글 유니코드 = (0xAC00 + (초성 위치 * 588) + (중성 위치 * 28) + 종성 위치).toChar()

 

인덱스를 찾아내는 방식도 어렵지 않다.

인덱스를 보면 ..  ㄱ -> ㄱ의 첫 중성(ㅏ) -> 종성을 싹 붙임(28회) => ㄱ -> ㄱ의 두번째 중성("ㅐ") -> 종성을 싹 붙여봄(28회) -> ... -> ㄱ의 모든 종성을 붙여봄(21 * 28)회 -> ㄴ의 첫 중성... 

이런 방식으로 인덱싱이 진행된다. 따라서, 전체 숫자에서 21 * 28을 한 몫이 초성이 된다.

val first = number / 21 / 28

 

그럼 중성은? 589번째 글자(나)를 보면 초성과 중성을 전부 다 돈 값(초성 ㄱ의 케이스 588번) 후 다음 ㄴ 초성의 내부의 중, 종성을 돌 준비를 해야한다. 즉, 이미 앞에서 돌았던 초성의 값을 빼고(전체 인덱스 - 초성 인덱스 * (21(중성 전체 인덱스) * 28(종성 전체 인덱스)))), 마찬가지로 모든 종성을 붙여본 케이스를 나누면 중성의 값을 얻을 수 있다.

val second = (number - first * (21 * 28)) / 28

 

그럼 종성은? 마찬가지로 남은 값에서 앞에 돈 중성 값을 빼버리면 된다.

val third = (number - first * (21 * 28) - second * 28)

 

이제 인덱스를 구한다.

이 때 주의할 점은 글자의 인덱스를 1부터 시작하지만, 실질적으로 초 중 종성의 배열 시작점은 0에서 부터 시작하기 때문에 입력받는 인덱스에서 -1을 해야한다.

 

전체 코드를 보자.

fun main(args: Array<String>) {
    question11282()
}

fun question11282() {
    val number = readln().toInt() - 1
    val first = number / 21 / 28
    val second = (number - first * (21 * 28)) / 28
    val third = (number - first * (21 * 28) - second * 28)

    val uni = (0xAC00 + (first * 588) + (second * 28) + third).toChar()
    println(uni)

}

 

 

반응형

'스터디(beakjoon)' 카테고리의 다른 글

Kotlin] 백준 2606 풀이  (0) 2024.05.23
Kotlin] 백준 15128번 문제 풀이  (0) 2024.05.17
Kotlin] 백준 14928번 문제 풀이  (0) 2024.04.29
Kotlin] 백준 1271번 풀이  (0) 2024.04.25
Kotlin] 백준 17427번 풀이  (0) 2024.04.24