주어진 문자의 자음별 개수를 구해주세요.
const input = "사과1호랑이,고니 수박BT닭";
const BASE_INDEX = '가'.charCodeAt(0);
const CHOSUNG_LIST = ['ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ'];
const OUTPUT_LIST = ['ㄱ', 'ㄴ', 'ㄷ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅅ', 'ㅇ' , 'ㅈ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ'];
const answer = (input) => {
const CHOSUNG = input
.replace(/[^ㄱ-ㅎ가-힣]/g, "")
.split("")
.map((str) => CHOSUNG_LIST[parseInt((str.charCodeAt(0) - BASE_INDEX) / 588)]);
return OUTPUT_LIST.reduce((acc, cur) => {
acc[cur] = CHOSUNG.filter((str) => str === cur).length;
return acc;
}, {});
};
answer(input);
// {
// 'ㄱ': 2,
// 'ㄴ': 1,
// 'ㄷ': 1,
// 'ㄹ': 1,
// 'ㅁ': 0,
// 'ㅂ': 1,
// 'ㅅ': 2,
// 'ㅇ': 1,
// 'ㅈ': 0,
// 'ㅊ': 0,
// 'ㅋ': 0,
// 'ㅌ': 0,
// 'ㅍ': 0,
// 'ㅎ': 1
// }
replace(/^ㄱ-ㅎ가-힇/g, "")
: 한글 외 다른 문자열을 제외한다.
split("")
: 문자열을 한 글자씩 배열로 바꾼다.
map((str) => CHOSUNG_LIST[parseInt((...)])
:
[ '사', '과', '호', '랑', '이', '고', '니', '수', '박', '닭' ]에 대한 초성을 뽑아내야 한다.
'가'.charCodeAt(0)=44032
값이다.'까'.charCodeAt(0)=44620
로,588(=44620-44032)
주기로 변경된다.str.charCodeAt(0)
에서 '가'.charCodeAt(0)
를 빼고 초성 주기 588을 나눠 현재 문자열이 CHOSUNG_LIST
에 어디에 해당하는지 구한다.OUTPUT_LIST.reduce((acc, cur) => {...}, {})
:
[ 'ㅅ', 'ㄱ', 'ㅎ', 'ㄹ', 'ㅇ', 'ㄱ', 'ㄴ', 'ㅅ', 'ㅂ', 'ㄷ' ]를 결과 형식에 맞게 카운트를 계산해줘야 한다.
OUTPUT_LIST
변수를 따로 만들었다.reduce
함수를 통해 CHOSUNG
변수에서 현재 초성이 몇 개 있는지 확인해주면 된다!