[BAEKJOON] 백준 11282: 한글 (C#)

2024. 7. 9. 15:20IT/BaekJoon

문제 링크

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

 

 

문제

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

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

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

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

입력으로 N이 주어졌을 때, N번째 글자를 구하는 프로그램을 작성하시오.

 

 

입력

첫째 줄에 N(1 ≤ N ≤ 11,172)이 주어진다.

 

 

출력

첫째 줄에 N번째 글자를 출력한다. 문자열의 인코딩은 UTF-8을 사용해야 한다.

 

 

 

통과한 답안

namespace _11282
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int N = int.Parse(Console.ReadLine());

            int baseCode = 0xAC00;

            int numSta = 19;
            int numMid = 21;
            int numEnd = 28;

            int idx = N - 1;
            int idxSta = idx / (numMid * numEnd);
            idx = idx % (numMid * numEnd);
            int idxMid = idx / numEnd;
            int idxEnd = idx % numEnd;

            int uniCode = baseCode + (idxSta * numMid * numEnd) + (idxMid * numEnd) + idxEnd;

            Console.WriteLine((char)uniCode);
        }
    }
}

 

초성과 중성, 종성의 개수의 곱인 N(1 <= N <= 11,172)가 주어졌을 때,

해당 숫자가 어떤 글자를 나타내는지 출력하는 문제이다.

 

이 문제를 배열을 이용해서 초성, 중성, 종성을 찾은 뒤에 이를 합치는 방식으로 구현하려고 하였지만,

한글의 자모를 합치는 것이 불가능하여 방법을 찾아보았더니 유니코드를 이용하여 해결할 수 있었다.

 

한글 유니코드는 0xAC00을 시작점으로하여,

초성, 중성, 종성을 더하는 방식으로 한글을 출력할 수 있게 되어있다.

 

이를 이용하여 시작 유니코드에 각각의 값을 더하는 방식으로 구현하였다.

이 때, 배열과 같은 방식으로 처음 인덱스가 0, 0, 0이므로,

입력 받은 값 N에서 1을 뺀 후에 각각의 인덱스를 구하는 방식으로 구현하였다.