2 분 소요

문자열 묶기

문제 보기

문제

문제 설명

문자열 배열 strArr이 주어집니다. strArr의 원소들을 길이가 같은 문자열들끼리 그룹으로 묶었을 때 가장 개수가 많은 그룹의 크기를 return 하는 solution 함수를 완성해 주세요.

풀이(일단은)

function solution(strArr) {
  const g = new Map();
  strArr
    .map((s) => s.length)
    .forEach((i) => (g.has(i) ? g.set(i, g.get(i) + 1) : g.set(i, 1)));
  return [...g.values()].reduce((a, i) => Math.max(a, i), 0);
}

설명

이번에는 풀이를 자랑하려는 게 아니다. 코드 보면, 참 지저분하지 않은가? 그런데 이런 문제도, 사실 누군가가 이미 해결해 놓았다. 해결만 한 게 아니라, 일반화해서 라이브러리까지 만들어놓았다. 그걸 모아놓은 게 바로 LoDash 이다.

Lodash를 순수 함수형으로 사용하고 싶거나 지연 평가를 적극적으로 사용하고 싶거나 하여튼 뭔가 고오급으로 즐기고 싶은 사람은 FxTS 를 추천한다. LoDash에 없는 프라미스 관련 함수들이 준비되어 있다. 다만 제공하는 함수의 수 자체는 LoDash보다 적기 때문에 완전히 대체하는 건 불가능하다. 사실 둘 다 쓴다고 라이브러리 충돌이 일어나거나 하진 않으니까 헷갈리지 않을 자신 있다면 둘 다 설치해도 무방하다. 물론 이렇게 쓸 경우 동료들이 불만일 순 있겠다. 😂

그럼 LoDash의 해법은 무엇이냐, 놀랍도록 간단하다.

_(strArr)
  .groupBy("length")
  .toPairs()
  .maxBy((o) => o[1].length)[1].length;
strArr 을
1. 원소의 길이로 묶고
2. [k, v] 쌍으로 변환한 뒤
3. v의 길이가 가장 긴 원소를 뽑아
4. 그 길이를 반환한다

다시 쓰면

strArr의 원소들을
1. 길이가 같은 문자열들끼리 그룹으로 묶고
2. 그룹 object를 [k, v] 쌍으로 변환한 뒤
3. v의 개수(길이가 같은 문자열의 개수)가 가장 많은 원소(그룹)를 추출하고
4. 그 원소(그룹)의 원소의 개수를 반환한다

아마 더 간단한 해법이 존재할 것이다. pair를 하지 않고 maxBy에서 key로 predicate 하는 방법을 찾지 못해서 pair를 중간에 삽입했다.

테스트 코드는 여기에 올려두었다.

Lodash라이브러리에는 자바스크립트 기본 Array객체에 없어서 아쉬운 sum이나 mean(평균) 함수들이 마련되어 있다. 로대시의 문법에 익숙해지는 데에는 시간이 조금 걸리지만 일단 한 번 익숙해지고 나면 데이터 조작을 마치 SQL이나 엑셀 다루듯이 할 수 있는 편리함을 누릴 수 있다. 배열의 병합이나 청크로 나누기 같이 다른 코딩 테스트 문제에 출제되었던 것들도 여기엔 이미 다 구현돼서 들어가 있다.

바퀴를 재발명하는 실수를 하지 말라고 말은 하지만, 요즘 세상에서는 바퀴가 이미 발명되어 있는지 찾아내는 것이야말로 진짜 지식인 것 같다. Know how가 아니라 Know where라고 했던가? 이런 건 ChatGPT한테 물어봐도 답을 주지 않을 것이다. 내가 명시적으로 “by using lodash library”라고 힌트라도 주지 않는 한 말이다.

댓글남기기