마음만은 새내기

항상 초심을 잃지 않고 생활하겠습니다~!

프로그래밍/Baekjoon Online Judge

BOJ 11282번(한글) 문제 풀이

동동매니저 2022. 1. 8. 14:55

★ solved.ac 난이도 : B4

(작성 시점 기준)


[문제 본문 링크]

 

11282번: 한글

한글의 각 글자는 초성, 중성, 종성으로 이루어져 있고, 이 세 가지를 모아써서 한 글자를 나타낸다. 초성은 ㄱ, ㄲ, ㄴ, ㄷ, ㄸ, ㄹ, ㅁ, ㅂ, ㅃ, ㅅ, ㅆ, ㅇ, ㅈ, ㅉ, ㅊ, ㅋ, ㅌ, ㅍ, ㅎ로 총 19개가 있

www.acmicpc.net


N번째 한글을 출력하는 문제로, UTF-8 인코딩을 이해하셔야 합니다.

한글의 UTF-8 코드를 자세히 살펴보면 규칙을 찾을 수 있습니다.

(한글의 UTF-8 코드는 3Byte입니다.)

  • 규칙 1. 첫 번째 글자인 '가'의 UTF-8 코드는 0xEA, 0xB0, 0x80 (234, 176, 128)입니다.
  • 규칙 2. 마지막 글자인 '힣'의 UTF-8 코드는 0xED, 0x9E, 0xA3 (237, 158, 163)입니다.
  • 규칙 3. 모든 코드의 값은 0x80~0xBF (128~191) 범위에 속합니다. (첫 바이트 예외 : 0xEA~)

특히 규칙 3은 64진수와 비슷하며, 이를 활용하여 문제를 풀 수 있습니다.

규칙 3을 만족하면서 가장 빠른 코드의 값은 0xEA, 0x80, 0x80 (234, 128, 128)이고 규칙 1에서 언급한 '가'의 UTF-8 코드는 0xEA, 0xB0, 0x80 (234, 176, 128)입니다.

두 코드 값의 차이는 0x00, 0x30, 0x00 (0, 48, 0)이고, 64진수로 표현된 값을 10진수로 변환하면 3072가 됩니다.

 

먼저 입력으로 주어진 N에 3071을 더합니다. (0이 아닌 1부터 시작하므로 1-Based0-Based로 변환하기 위함)

그리고 이 값을 64진수로 변환한 다음 결과 값에 각각 234, 128, 128을 더하고 문자열 형식으로 출력하면 됩니다.


[소스 코드 (C++98)]


★ 틀린 점이 있다면 알려주세요~!