11283번 : 한글2

상환·2021년 12월 9일
0
post-thumbnail

문제

한글의 각 글자는 초성, 중성, 종성으로 이루어져 있고, 이 세 가지를 모아써서 한 글자를 나타낸다.

초성은 ㄱ, ㄲ, ㄴ, ㄷ, ㄸ, ㄹ, ㅁ, ㅂ, ㅃ, ㅅ, ㅆ, ㅇ, ㅈ, ㅉ, ㅊ, ㅋ, ㅌ, ㅍ, ㅎ로 총 19개가 있고, 중성은 ㅏ, ㅐ, ㅑ, ㅒ, ㅓ, ㅔ, ㅕ ㅖ, ㅗ, ㅘ, ㅙ, ㅚ, ㅛ, ㅜ, ㅝ, ㅞ, ㅟ, ㅠ, ㅡ, ㅢ, ㅣ로 총 21개, 종성은 없음, ㄱ, ㄲ, ㄳ, ㄴ, ㄵ, ㄶ, ㄷ, ㄹ, ㄺ, ㄻ, ㄼ, ㄽ, ㄾ, ㄿ, ㅀ, ㅁ, ㅂ, ㅄ, ㅅ, ㅆ, ㅇ, ㅈ, ㅊ, ㅋ, ㅌ, ㅍ, ㅎ로 총 28개가 있다.

첫 번째 글자는 초성에서 ㄱ, 중성에서 ㅏ, 종성에서 없음을 합친 "가"가 되고, 두 번째 글자는 초성에서 ㄱ, 중성에서 ㅏ, 종성에서 ㄱ을 합친 "각"이 된다. 마지막 글자는 초성에서 ㅎ, 중성에서 ㅣ, 종성에서 ㅎ를 합친 "힣"이 된다.

초성과 중성, 그리고 종성을 합쳐서 만들 수 있는 글자의 개수는 총 19 * 21 * 28 = 11,172개가 된다.

한글이 주어졌을 때, 몇 번째 글자인지 구하는 프로그램을 작성하시오.

입출력

1. 입력

첫째 줄에 글자 하나가 주어진다. 주어지는 글자는 UTF-8로 인코딩 되어 있는 한글이며, 문제 설명에 나온 방법으로 만들 수 있다.

2. 출력

입력으로 주어진 글자가 몇 번째인지 출력한다.

풀이

처음 문제를 봤을 때 입력 문자를 한글자모로 분리한 후, 배열의 인덱스 값으로 계산할 생각을 했다. 그래서 한글의 유니코드 저장 규칙인 (초성 * 21 + 중성) * 28 + 종성 + 0xAC00을 찾았으며 이 수식을 이용해서 자모를 분리하려 했지만 예제로 나온 입출력 값으로 검증을 했을 때 제대로 맞지 않는다는 것을 느꼈다.
30분 고민 후 구글링해본 결과 아스키코드를 이용한 문제임을 알았다. 너무 돌아갔어...

import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //'가'의 ASCII값에서 1뺀 44031을 빼줌
        System.out.println((int)scan.next().charAt(0)-44031);
    }
}

결과는

풀었다.

kotlin code

import java.util.*
fun main() = print(Scanner(System.`in`).next().get(0).code - 44031)
profile
레모네이드 커피

0개의 댓글