(알고리즘) Codewars : chracterFrequency

호두파파·2021년 3월 11일
0

알고리즘 연습

목록 보기
9/60
post-thumbnail

Description

Write a function that takes as its input a string and returns an array of
   arrays as shown below sorted in descending order by frequency and then by
   ascending order by character.
 
        :: Example ::
 
   characterFrequency('mississippi') ===
   [
     ['i', 4],
     ['s', 4],
     ['p', 2],
     ['m', 1]
   ]
 
        :: Example2 ::
 
   characterFrequency('miaaiaaippi') ===
   [
     ['a', 4],
     ['i', 4],
     ['p', 2],
     ['m', 1]
   ]
 
        :: Example3 ::
 
   characterFrequency('mmmaaaiiibbb') ===
   [
     ['a', 3],
     ['b', 3],
     ['i', 3],
     ['m', 3]
   ]
 
 var characterFrequency = function (string) {
    
};

문제풀이

문자열이 인풋으로 주어지면 중복되는 문자열의 개수를 나타내는 숫자를 문자와 함께 배열에 담아서 정렬한 다음 2차원 배열로 반환하는 문제

풀이

해쉬문제다. 그래서 처음 객체를 만들고, 배열로 접근하면 쉽게 문제를 해결할 수 있다. 객체를 2차원 배열로 정렬하기 위해 Object.entries(obj)를 이용했다. (반대는 Object.assing({}, arr))

자료 알아보기

// 반복되지 않는 첫 번째 문자열 반환하기
// 해쉬
function solution(s) {
  let answer;
  let obj={};
  for (let x of s) {
    if (obj[x]) {
      obj[x] += 1;
    } else {
      obj[x] = 1;
    }
  }
  answer = Object.entries(obj).sort();
  return answer.sort((a, b) => b[1] - a[1]);
}

const s = 'mississippi';
const n = 'miaaiaaippi';
const x = 'mmmaaaiiibbb';

console.log(solution(s));
console.log(solution(n));
console.log(solution(x));

다른 문제 풀이

export default function characterFrequency (string) {

  let convertToObj = string
    .split("")
    .sort()
    .reduce((all, one) => {
      if (one in all) {
        all[one]++
      } else {
        all[one] = 1;
      }
      return all
    }, {});

  let converToArray = [];
  
  for(let key in convertToObj) {
    converToArray.push([key, convertToObj[key]])
  }

  converToArray.sort((a, b) => {
    return b[1] - a[1]
  });
  return converToArray;
};

정말 유연하게 잘 풀어낸 문제, reduce는 정말이지 복잡한 알고리즘 식을 깔끔하게 정리해준다. acc로 빈 객체를 선언하고, 그 안에서 one이라고 표현된 벨류를 가진 all 키 값에 if 문을 통해 벨류를 증감시키는 방식을 사용했다.

그리고 객체 안에서, sort를 하기 위해 빈 배열을 다시 선언하고, 키 값을 순회하며, key값에 맞는 벨류를 할당해주었다.

자바스크립트의 유연함은 이중 배열의 요소에 접근할때 빛이 나는데,
return b[1] - a[1] 이렇게 간결하게 코드를 정리할 수 있다.


profile
안녕하세요 주니어 프론트엔드 개발자 양윤성입니다.

0개의 댓글