인덱스를 보면 .. ㄱ -> ㄱ의 첫 중성(ㅏ) -> 종성을 싹 붙임(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)
}