프라이D
프라이Develog(❁´◡`❁)
프라이D
전체 방문자
오늘
어제
  • ALL (378)
    • TDD, Cleancode with JavaScr.. (5)
    • 프로젝트 (32)
      • work (3)
      • 직접 만드는 기술 블로그 (2)
      • 데일리 옥션 (19)
      • 모락모락 (8)
    • Computer Science (1)
    • Algorithm & 자료구조 (94)
      • 알고리즘 w.JavaScript (53)
      • 자료구조 (5)
      • (인프런) 자바스크립트 알고리즘 문제풀이 (34)
    • JavaScript (45)
      • JavaScript (41)
      • 모던 자바스크립트 Deep Dive (4)
    • WEB (13)
    • 회고 (12)
    • TIL (109)
    • WIL (7)
    • Stacks (20)
      • React.js (6)
      • Next.js (1)
      • Redux (3)
      • Node.js (2)
      • GIT (2)
      • SAP (1)
    • 15일 메이킹 프로젝트 (15)
    • 이전 기록 (14)
    • ETC. (5)
    • ---------------2021 (6)
      • 내일배움단-웹개발 5주 (2)
      • 정보처리기사 (4)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • vanilaJS
  • nomadcoders
  • 국비지원
  • 내일배움카드
  • nomadcoder
  • Til
  • 코딩프로젝트
  • 자바스크립트
  • MySQL
  • 알고리즘
  • 비트마스크
  • JavaScript
  • 자바스크립트비트마스크
  • 투포인터알고리즘
  • 코드스테이츠
  • 자바스크립트알고리즘
  • 모던자바스크립트딥다이브
  • 내일배움단
  • 스파르타코딩클럽
  • 2023 인프콘 후기

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
프라이D

프라이Develog(❁´◡`❁)

Algorithm & 자료구조/(인프런) 자바스크립트 알고리즘 문제풀이

[알고리즘] 아나그램 (해쉬)

2022. 2. 22. 23:02

문제

Anagram이란 두 문자열이 알파벳의 나열 순서를 다르지만 그 구성이 일치하면 두 단어는 아나그램이라고 합니다.
예를 들면 AbaAeCe 와 baeeACA 는 알파벳을 나열 순서는 다르지만 그 구성을 살펴보면 A(2), a(1), b(1), C(1), e(2)로 알파벳과 그 개수가 모두 일치합니다. 즉 어느 한 단어를 재배열하면 상대편 단어가 될 수 있는 것을 아나그램이라 합니다.
길이가 같은 두 개의 단어가 주어지면 두 단어가 아나그램인지 판별하는 프로그램을 작성하세요.

아나그램 판별시 대소문자가 구분됩니다.

강사님의 풀이

function solution(str1, str2){
    let answer='YES'; 
    let hash = new Map();
    for(let x of str1){
        if(hash.has(x)) hash.set(x,hash.get(x)+1);
        else hash.set(x,1);
    }
    for(let x of str2){
        if(!hash.has(x) || hash.get(x)===0) return 'NO';
        //x 키값이 없거나, x의 value가 이미 0이면 아나그램이 아니므로 NO를 return
        else hash.set(x,hash.get(x)-1);
        //위 두 경우가 아니면 x의 value -1 값으로 set
    }

    return answer;
}

let a="abaaC";
let b="Caaab";
console.log(solution(a, b));
  • 비교 대상 문자열을 map 객체화 하여, x를 키로 갯수를 set 한다.
  • 문자열 2번을 반복문으로 돌며 map 객체에 key가 존재하는지, value가 0인지 판별해 아나그램 여부를 가린다.
  • 문자열의 요소를 하나씩 소거하며 판별하는 방법

나의 풀이 1

function solution(str1, str2){
    let answer='YES'; 
    let hash = new Map();
    for(let x of str1){
        if(hash.has(x)) hash.set(x,hash.get(x)+1);
        else hash.set(x,1);
    }
    for(let x of str2){
        if([...hash.keys()].includes(x)) {
            hash.set(x,hash.get(x)-1);
        }
        else return 'NO';
    }
    for(let [key,val] of hash){
        if(val !== 0) return 'NO';
    }

    return answer;
}

let a="abaaC";
let b="Caaab";
console.log(solution(a, b));
  • 풀이 설명을 듣고 작성했다. 강사님 풀이와 마찬가지로 x를 비교해 value를 하나씩 소거하는 방식.
  • x가 map객체에 key로 존재하는지 확인하려고 [...hash.keys()].includes(x) 를 썼는데, 생각해보니 hash.has(x) 만 써도 여부를 확인할 수 있다.
  • object.keys( ) 함수는 숫자키의 배열을 정렬된 순서로 반환한다.
  • 일치되지 않는 조건을 확인해 앞에서 결과 return 해주는게 더 좋은 것 같다. for...of 문으로 map을 하나씩 돌며 val이 0이 아닐 경우를 찾아 return 'NO'를 하도록 반복되는 부분이 있다.

나의 풀이 2

function solution(str1, str2){
    let answer='YES'; 
    let h1 = new Map();
    let h2 = new Map();
    for(let x of str1){
        if(h1.has(x)) h1.set(x,h1.get(x)+1);
        else h1.set(x,1);
    }
    for(let x of str2){
        if(h2.has(x)) h2.set(x,h2.get(x)+1);
        else h2.set(x,1);
    }
    h1 = [...h1.entries()].sort().join('');
    h2 = [...h2.entries()].sort().join('');

    if(h1!==h2) return 'NO';

    return answer;
}

let a="abaCC";
let b="Caaab";
console.log(solution(a, b));
  • 비교할 각 두 문자열을 map -> array 로 만든 뒤 join 해서 비교
  • 지금보니 이럴거면 굳이 map 객체로 만들 필요가 없네...
  • h1.entries( )로 key,value 값을 반환받고, 이를 spread 연산자로 넘겨 배열화함
  • object.entries( ) 는 [key, value] 형식의 쌍으로 반환한다.
  • 그리고 이를 정렬해서 join했는데 지금보니 굳이 이렇게 할 필요가 없군...

참고자료

[Map - JavaScript | MDN

 

 

Map - JavaScript | MDN

The Map object holds key-value pairs and remembers the original insertion order of the keys. Any value (both objects and primitive values) may be used as either a key or a value.

developer.mozilla.org

 

 

[Javascript] Map 객체 정렬하는 법

@ 방법 const myMap = new Map(); myMap.set("a",3); myMap.set("c",4); myMap.set("b",1); myMap.set("d",2); // sort by value const mapSort1 = new Map([...myMap.entries()].sort((a, b) => b[1] - a[1])); c..

llnote.tistory.com

 

저작자표시 (새창열림)

'Algorithm & 자료구조 > (인프런) 자바스크립트 알고리즘 문제풀이' 카테고리의 다른 글

[알고리즘] 최대점수 구하기(DFS)  (0) 2022.03.16
[알고리즘] 합이 같은 부분집합(DFS)  (0) 2022.03.09
[알고리즘] 학급회장 (해쉬)  (0) 2022.02.22
[알고리즘] 부분 수열의 합 2  (0) 2022.02.17
[알고리즘]연속 부분 수열 1 - 투포인터 알고리즘  (0) 2022.02.13
    'Algorithm & 자료구조/(인프런) 자바스크립트 알고리즘 문제풀이' 카테고리의 다른 글
    • [알고리즘] 최대점수 구하기(DFS)
    • [알고리즘] 합이 같은 부분집합(DFS)
    • [알고리즘] 학급회장 (해쉬)
    • [알고리즘] 부분 수열의 합 2
    프라이D
    프라이D
    틀린내용 정정 및 개선사항은 언제든지 댓글 달아주세요 :D

    티스토리툴바