본문 바로가기

Algorithm

[Algorithm] 백준 11283(한글과 유니코드)

728x90
반응형

백준 = 문제번호 11283: 한글 2 문제

문제


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

 

초성은 ㄱ, ㄲ, ㄴ, ㄷ, ㄸ, ㄹ, ㅁ, ㅂ, ㅃ, ㅅ, ㅆ, ㅇ, ㅈ, ㅉ, ㅊ, ㅋ, ㅌ, ㅍ, ㅎ로 총 19개가 있고,

중성은 ㅏ, ㅐ, ㅑ, ㅒ, ㅓ, ㅔ, ㅕ ㅖ, ㅗ, ㅘ, ㅙ, ㅚ, ㅛ, ㅜ, ㅝ, ㅞ, ㅟ, ㅠ, ㅡ, ㅢ, ㅣ로 총 21개, 종성은 없음,

ㄱ, ㄲ, ㄳ, ㄴ, ㄵ, ㄶ, ㄷ, ㄹ, ㄺ, ㄻ, ㄼ, ㄽ, ㄾ, ㄿ, ㅀ, ㅁ, ㅂ, ㅄ, ㅅ, ㅆ, ㅇ, ㅈ, ㅊ, ㅋ, ㅌ, ㅍ, ㅎ로 총 28개가 있다.

 

첫 번째 글자는 초성에서 ㄱ, 중성에서 ㅏ, 종성에서 없음을 합친 "가"가 되고,

두 번째 글자는 초성에서 ㄱ, 중성에서 ㅏ, 종성에서 ㄱ을 합친 "각"이 된다.

마지막 글자는 초성에서 ㅎ, 중성에서 ㅣ, 종성에서 ㅎ를 합친 "힣"이 된다.

 

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

 

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

입력


첫째 줄에 글자 하나가 주어진다.

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

출력


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

예제 입력

예제 출력

1
11172
4146

 

풀이


문제를 잘 봐야한다

첫째 줄에 글자 하나가 주어진다.

주어지는 글자는 UTF-8로 인코딩 되어 있는 한글이며,

문제 설명에 나온 방법으로 만들 수 있다.

 

 

얼핏보면 배열을 이용해서 풀 수 있다고도 생각되는데 조금 더 컴퓨터과학적으로 접근해보자.

 

UTF-8Unicode의 일종으로 한글을 3Byte로 표현한다.

정규식(Regular Expression) 표현상 한글은 가-힣 에 해당하는데

문제를 잘 보면 정규식 표현의 순서를 따라간다.

그리고 이는 유니코드 도표의 순서와도 일치한다.

 

UTF-8 도표상 EA B0 80 으로 표현된다.

자바의 String클래스에서는 codePointAt이라는 메서드를 제공하는데,

이 메서드는 문자열을 내부적으로 UTF-16방식으로 인코딩한 후

이를 charint 로 변환한 10진수 정수형 값을 반환해준다.

 

System.out.println("가".codePointAt(0)); // 출력: 44032

 

문제에서는 가를 1번 시작으로 정의하고 있으므로 이 값에서 44031을 빼주면 된다.

public class baekjoon_11283 {

   public static void main (String[] args) {

      Scanner scanner = new Scanner(System.in);

      String str = scanner.nextLine();

      System.out.println(str.codePointAt(0) - 44031);

      scanner.close();

   }

}

 

728x90
반응형