[알고리즘] anagram

2022. 11. 2. 09:53·개발/알고리즘
728x90
반응형

애너그램은 단어나 문장을 구성하고 있는 문자의 순서를 바꾸어 다른 단어나 문장을 만드는 것이다.

 

문제

두개의 문자열이 주어진다. 두 문자열의 요소는 같지만 순서만 뒤바껴있는지 확인하는 함수를 만든다.조건 : 시간복잡도 O(n)

예시 : 

validAnagram("", ""); // true
validAnagram("aaz", "zza"); // false
validAnagram("anagram", "nagaram"); // true
validAnagram("rat", "car"); // false) // false
validAnagram("awesome", "awesom"); // false
validAnagram("amanaplanacanalpanama", "acanalmanplanpamana"); // false
validAnagram("qwerty", "qeywrt"); // true

 

풀이

(1)

function validAnagram(str1, str2) {
  //길이가 같으면 false
  if (str1.length !== str2.length) {
    return false;
  }
  //각 객체에 키값으로 넣고 value로 갯수 파악
  const obj1 = {};
  const obj2 = {};
  for (let i = 0; i < str1.length; i++) {
    obj1[str1[i]] = ++obj1[str1[i]] || 1;
  }
  for (let i = 0; i < str2.length; i++) {
    obj2[str2[i]] = ++obj2[str2[i]] || 1;
  }
  //비교
  for (let key in obj1) {
    // 있는지 비교
    if (!(key in obj2)) {
      return false;
    }
    // 같은 갯수를 가지고 있는지 비교
    if (obj1[key] !== obj2[key]) {
      return false;
    }
  }
  //안걸리면 true
  return true;
}

(2) 객체 하나만 써서 풀기

function validAnagram(first, second) {
  if (first.length !== second.length) {
    return false;
  }

  const lookup = {};

  for (let i = 0; i < first.length; i++) {
    let letter = first[i];
    // if letter exists, increment, otherwise set to 1
    lookup[letter] ? lookup[letter] += 1 : lookup[letter] = 1;
  }

  for (let i = 0; i < second.length; i++) {
    let letter = second[i];
    // can't find letter or letter is zero then it's not an anagram
    if (!lookup[letter]) {
      return false;
    } else {
      lookup[letter] -= 1;
    }
  }

  return true;
}

 

728x90
반응형

'개발 > 알고리즘' 카테고리의 다른 글

[알고리즘] 배열에 중복되지 않는 요소 개수 찾기  (0) 2022.11.02
[알고리즘] 다중 포인터  (0) 2022.11.02
[알고리즘] 배열 안의 요소 비교  (1) 2022.11.02
[알고리즘] 알고리즘 문제 풀이 순서  (0) 2022.11.02
[코딩테스트] 프로그래머스 문제모음  (0) 2022.11.02
'개발/알고리즘' 카테고리의 다른 글
  • [알고리즘] 배열에 중복되지 않는 요소 개수 찾기
  • [알고리즘] 다중 포인터
  • [알고리즘] 배열 안의 요소 비교
  • [알고리즘] 알고리즘 문제 풀이 순서
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    node.js
    node
    프로그래머스
    30일챌린지
    블록체인
    js
    30일 챌린지
    하이퍼레저
    erc20
    명령어
    mysql
    ERC721
    컨테이너
    React
    html
    CSS
    도커
    nodejs
    go
    go언어
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
[알고리즘] anagram
상단으로

티스토리툴바