글 작성자: bbangson
반응형

 

미스터 카멜 기업과제


 

난이도 : 백준 기준 실버(1~3)

 

 개인적으로 문제 자체는 어렵지 않지만 평소 접하지 못했던 한글 초성 분리 알고리즘을 검색해서 공부해야 하기 때문에, 이 부분에서 난이도가 올라가지 않았나 싶습니다. 문제를 해결하는데 도움이 됐던 링크는 하단에 따로 걸어두겠습니다.

 

 저는 이 문제를 map 자료구조를 활용해서 해결했습니다. 초성으로 가능한 모든 자음을 map에 key값으로 넣어주었습니다. 

그다음 초성 분리 알고리즘을 적용하여 입력받은 값이 한글인 경우만을 추출하였습니다. 

 

 유니코드를 얻는 과정에서 44032를 빼는 이유는 '가'를 나타내는 유니코드가 44032이기 때문입니다. 이 숫자를 상수로 하여 뺀 값을 저장했습니다. (입력 값이 '가' 라면 uni 값은 0입니다.)

 

 초성은 589마다 바뀌는데 배열의 시작 번호는 0번이므로 uni를 588로 나눠준 값을 입력합니다. 이 때 소수점은 없애기 위해 Math.floor 메소드를 통해 제거합니다. 초성이 자음이면 map 자료 구조에 해당하는 key 값의 value를 +1 합니다.

 

 문제의 출력문에는 ㄲ" , "ㄸ", "ㅃ", "ㅆ", "ㅉ"이 없기 때문에, 반복문으로 순회할 때 key값이 이들에 해당하면 출력하지 않습니다. 

 

시간 복잡도는 초성에 해당하는 모든 자음의 길이를 L, 입력의 길이를 N이라 가정한다면 첫 map 자료구조 입력을 위한 L + 초성 분리를 위해 input의 길이만큼 반복문 N + 출력을 위해 map을 돌아야 하므로 L.

 

즉, 2L + N이지만 빅오 표기법으로 인해 총 시간 복잡도는 L+N의 복잡도가 나오게 됩니다.

 

  코드
const map = new Map();
const consonant = [
  "ㄱ", "ㄲ","ㄴ","ㄷ","ㄸ","ㄹ","ㅁ","ㅂ","ㅃ","ㅅ","ㅆ","ㅇ","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ",
];
const input = "사과1호랑이,고니 수박BT닭";

// 자음 map에 넣기
for (let i in consonant) {
  map.set(consonant[i], 0);
}

// 초성 분리
for (let i in input) {
  let uni = input[i].charCodeAt(0) - 44032;

  if (uni >= 0 && uni < 11172) {
    let cho = Math.floor(uni / 588);
    map.set(consonant[cho], map.get(consonant[cho]) + 1);
  }
}

// 출력
for (let [key, value] of map) {
  // ㄲ, ㄸ, ㅃ, ㅆ, ㅉ continue;
  if ( key === "ㄲ" || key === "ㄸ" || key === "ㅃ" || key === "ㅆ" || key === "ㅉ" ) continue;
  console.log(key + ":" + value);
}

 

 

피드백 환영합니다. 

 

 

참고 링크

https://zetawiki.com/wiki/UTF-8_%ED%95%9C%EA%B8%80_%EC%B4%88%EC%84%B1_%EC%B6%94%EC%B6%9C_(%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8) 

 

UTF-8 한글 초성 추출 (자바스크립트) - 제타위키

다음 문자열 포함...

zetawiki.com

https://blog.naver.com/PostView.nhn?blogId=tk2rush90&logNo=221085154547&parentCategoryNo=&categoryNo=7&viewDate=&isShowPopularPosts=true&from=search 

 

[자바스크립트] 한글 자음 모음 분리 / 초성 * 중성 * 종성

0. 서문한글 자음모음 분리 기능을 이용할 일이 생겨서 알아보았다. 핵심함수는 charCodeAt( ). 어렵진 ...

blog.naver.com

 

 

https://wecode.co.kr/?gclid=CjwKCAjwsNiIBhBdEiwAJK4khpBc17HOCpvHeDmnOgZbj97N_sD1Y9qhVVvNiR2sIfsY0XxiVtPnUxoC0AYQAvD_BwE

 

WeCode | 위코드 | 코딩 부트캠프 | 코딩교육 | 온라인 부트캠프

wecode(위코드)의 부트캠프를 통해 개발자로서 커리어를 시작하세요.

wecode.co.kr

 

반응형