[Assignment 5 알고리즘] 미스터카멜 - 주어진 문자의 자음별 개수를 구해주세요

이다은·2021년 8월 13일
0

프리온보딩-회고록

목록 보기
6/11
post-thumbnail

🔗 노션 링크


📑 과제 내용

주어진 문자의 자음별 개수를 구해주세요.

  • input: "사과1호랑이,고니 수박BT닭"
  • output:
    ㄱ:2
    ㄴ:1
    ㄷ:1
    ㄹ:1
    ㅁ:0
    ㅂ:1
    ㅅ:2
    ㅇ:1
    ㅈ:0
    ㅊ:0
    ㅋ:0
    ㅌ:0
    ㅍ:0
    ㅎ:1

🔰 자바스크립트 코드 작성

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) => {...}, {}) :
    [ 'ㅅ', 'ㄱ', 'ㅎ', 'ㄹ', 'ㅇ', 'ㄱ', 'ㄴ', 'ㅅ', 'ㅂ', 'ㄷ' ]를 결과 형식에 맞게 카운트를 계산해줘야 한다.

    • 'ㄲ', 'ㄸ', 'ㅃ', 'ㅆ', 'ㅉ' 5가지는 정답 output에 없어서 OUTPUT_LIST 변수를 따로 만들었다.
    • reduce 함수를 통해 CHOSUNG 변수에서 현재 초성이 몇 개 있는지 확인해주면 된다!
profile
단단_프로트엔드개발자!

0개의 댓글