개발후라이
개발후라이
개발후라이
  • 분류 전체보기 (287)
    • Web Front End (76)
      • Javascript & Typescript (26)
      • React (12)
      • Vue (4)
      • Nodejs (1)
      • HTML (6)
      • CSS (8)
      • HTTP (6)
      • 책 - Review (8)
    • TIL (0)
    • Problem Solved (135)
      • 알고리즘 (4)
      • BOJ (67)
      • Programmers (8)
      • HackerRank (33)
      • LeetCode (23)
    • 회고 (4)
      • 오늘의 회고 (16)
      • 주간 회고 (15)
      • 월간 회고 (7)
      • WakaTime (9)
    • Git (3)
    • 기타 (15)
      • 취업 (5)
      • 자격증 (1)

블로그 메뉴

  • GitHub
  • LinkedIn
  • 홈

인기 글

태그

  • TypeScript
  • JavaScript
  • 노개북
  • 노마드북클럽
  • 개발자
  • 회고
  • 프론트엔드
  • 릿코드
  • 자바스크립트
  • 오늘의회고

최근 댓글

최근 글

전체 방문자
오늘
어제

티스토리

hELLO · Designed By 정상우.
개발후라이
Problem Solved/HackerRank

[HackerRank][Javascript] Sherlock and Anagrams

[HackerRank][Javascript] Sherlock and Anagrams
Problem Solved/HackerRank

[HackerRank][Javascript] Sherlock and Anagrams

2020. 7. 27. 12:09
반응형

문제 - Sherlock and Anagrams

문제 설명

입력된 문자열에서 발생하는 모든 Anagram의 수를 반환하는 문제

  • 이 문제는 Map을 쓰지 않고 풀었다가 한참을 고생한 문제이다. Map의 성능을 체감하게 된 문제이다.
  • 일반 배열로 풀게 되면 time limit이 더 많이 걸리게 되는 것 같다.
  1. 우선 반복문을 돌리기 위해 입력된 문자열을 배열로 만든다.
  2. 자른 문자열의 개수를 저장하기 위해 Map을 새로 선언한다.
  3. makeSubList는 len이라는 인자를 받아 해당 숫자만큼 자르고 정렬해 개수를 앞서 만든 Map에 저장한다.
    이 때, makeSubList가 reduce 안에서 불려서 바로 계산되기 때문에 함수 시작 부분에서 .clear()를 통해 Map을 비워준다.
  4. isAnagram에서는 makeSubList 함수에서 만들어진 Map을 바탕으로 Anagram의 개수를 센다.
  • Anagram의 개수를 세는 방법인 (curr * (curr - 1)) / 2은 규칙을 바탕으로 만들어진 것이다.

s가 kkkk일 때 잘린 문자열, 중복 개수, 애나그램 개수는 아래 표와 같다.
애나그램 개수는 위의 식과 같은 규칙을 가지고 있어 계산식으로 간단하게 풀 수 있다.

잘린 문자열 중복 개수 애나그램 개수
k 4 ( 4 * (4 - 1) ) / 2 = 6
kk 3 ( 3 * (3 - 1) ) / 2 = 3
kkk 2 ( 2 * (2 - 1) ) / 2 = 1

성공 코드

function sherlockAndAnagrams(s) {
  const sList = s.split(""); // 1
  let mapOfSub = new Map(); // 2

  const makeSubList = (len) => {
    // 3
    mapOfSub.clear();
    sList.forEach((ss, i) => {
      const splitStr = s.substring(i, i + len);
      const sortStr = splitStr.split("").sort().join("");
      if (sortStr.length === len) {
        mapOfSub.has(sortStr)
          ? mapOfSub.set(sortStr, mapOfSub.get(sortStr) + 1)
          : mapOfSub.set(sortStr, 1);
      }
    });
  };

  const isAnagram = (len) => {
    // 4
    makeSubList(len);
    return [...mapOfSub.values()].reduce((prev, curr) => prev + (curr * (curr - 1)) / 2, 0);
  };

  return sList.reduce((prev, curr, currIndex) => {
    if (!currIndex) return prev + 0;
    return prev + isAnagram(currIndex);
  }, 0);
}
반응형
저작자표시 (새창열림)
    'Problem Solved/HackerRank' 카테고리의 다른 글
    • [HackerRank][Javascript] Frequency Queries
    • [HackerRank][Javscript] Map - Count Triplets
    • [HackerRank][Javascript] Two Strings
    • [HackerRank][Javascript] Hash Tables: Ransom Note
    개발후라이
    개발후라이
    어제보다 오늘 발전하기 위한 공간 https://github.com/choisohyun
    개발후라이어제보다 오늘 발전하기 위한 공간 https://github.com/choisohyun

    티스토리툴바

    개인정보

    • 티스토리 홈
    • 포럼
    • 로그인

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.