W3 - 기업과제 5 | 코딩테스트

yisu.kim·2021년 8월 15일
0

Pre Onboarding

목록 보기
7/16
post-thumbnail

📍 원티드 프리온보딩 과정에 참여하여 미스터카멜 기업과제를 받아 문제를 풀어보았습니다.

문제

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

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. 초성을 가져오는 getOnset 함수를 만들었다. 다음과 같이 동작한다.
1. 전달받은 한글 문자를 charCodeAt 함수를 사용해 유니코드로 변환한다.
2. 위의 수식을 참고하여 초성의 인덱스를 찾는다.
3. 미리 선언한 초성 배열 ONSETS에서 인덱스에 맞는 초성 문자를 가져온다.
  1. 겹자음을 제외한 초성 배열 SINGLE_ONSETS를 사용해 개수가 0으로 초기화된 result 객체를 생성한다.
  2. input에서 정규식 /[가-힣]/g을 사용해 한글만 추출한다. 항상 완전한 문자로 들어온다고 가정해 'ㄱ-ㅎ'은 고려하지 않았다.
  3. 이제 한글 문자열을 forEach로 돌면서 result에 초성 자음 개수를 카운팅한다.
// 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}

#wanted #wecode #rootimpact #mrcamel #멘토 김예리님

0개의 댓글