📍 원티드 프리온보딩 과정에 참여하여 미스터카멜 기업과제를 받아 문제를 풀어보았습니다.
input: "사과1호랑이,고니 수박BT닭"
output:
ㄱ:2
ㄴ:1
ㄷ:1
ㄹ:1
ㅁ:0
ㅂ:1
ㅅ:2
ㅇ:1
ㅈ:0
ㅊ:0
ㅋ:0
ㅌ:0
ㅍ:0
ㅎ:1
📦 codesandbox에서 실습이 가능합니다.
output을 봤을 때 초성의 자음 개수만 구하는 것으로 판단하고 먼저 한글 초성과 겹자음 제외 초성을 정의했다.
// hangul.js
export const ONSETS = [
'ㄱ',
'ㄲ',
'ㄴ',
'ㄷ',
'ㄸ',
'ㄹ',
'ㅁ',
'ㅂ',
'ㅃ',
'ㅅ',
'ㅆ',
'ㅇ',
'ㅈ',
'ㅉ',
'ㅊ',
'ㅋ',
'ㅌ',
'ㅍ',
'ㅎ',
];
export const SINGLE_ONSETS = [
'ㄱ',
'ㄴ',
'ㄷ',
'ㄹ',
'ㅁ',
'ㅂ',
'ㅅ',
'ㅇ',
'ㅈ',
'ㅊ',
'ㅋ',
'ㅌ',
'ㅍ',
'ㅎ',
];
export const GA = 0xac00;
[자바스크립트] 한글의 초성, 중성, 종성 분리하기에서 수식 참고
- 한글 유니코드값 = ((초성 * 21) + 중성) * 28 + 종성 + 0xAC00
- 초성 = ((한글 유니코드값 – 0xAC00) / 28) / 21
1. 전달받은 한글 문자를 charCodeAt 함수를 사용해 유니코드로 변환한다.
2. 위의 수식을 참고하여 초성의 인덱스를 찾는다.
3. 미리 선언한 초성 배열 ONSETS에서 인덱스에 맞는 초성 문자를 가져온다.
// solution.js
import { ONSETS, SINGLE_ONSETS, GA } from './hangul';
function solution(sentence) {
const getOnset = (korChar) => {
const unicode = korChar.charCodeAt(0);
const onsetIndex = parseInt((unicode - GA) / 28 / 21, 10);
return ONSETS[onsetIndex];
};
const result = SINGLE_ONSETS.reduce(
(acc, curr) => ({ ...acc, [curr]: 0 }),
{}
);
const korChars = sentence.match(/[가-힣]/g);
korChars.forEach((korChar) => {
const onset = getOnset(korChar);
result[onset] += 1;
});
return result;
}
export default solution;
const input = '사과1호랑이,고니 수박BT닭';
const output = solution(input);
console.log(output);
// {"ㄱ":2,"ㄴ":1,"ㄷ":1,"ㄹ":1,"ㅁ":0,"ㅂ":1,"ㅅ":2,"ㅇ":1,"ㅈ":0,"ㅊ":0,"ㅋ":0,"ㅌ":0,"ㅍ":0,"ㅎ":1}