[js] 문자열 묶기

sookyoung.k·2024년 6월 7일
1
post-thumbnail

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

제한사항

  • 1 ≤ strArr의 길이 ≤ 100,000
    • 1 ≤ strArr의 원소의 길이 ≤ 30
    • strArr의 원소들은 알파벳 소문자로 이루어진 문자열입니다.

나의 풀이

function solution(strArr) {
    let result = [];
    
    let numCnt = strArr.map((v) => v = v.length);
    let set = Array.from(new Set(numCnt));
    
    for(let i=0; i<set.length; i++) {
        let el = numCnt.filter(v => v === set[i]).length;
        result.push(el)
    }
    
    return Math.max(...result)
}
  • result를 빈 배열로 초기화한다.
  • numCnt 배열에 각 문자열의 길이를 저장한다.
  • set에 배열의 중복된 값을 제거한 고유의 값들을 저장한다.
  • set 배열을 순회하며 다음 작업을 수행한다.
    • numCnt 배열에서 현재 set요소와 같은 값의 개수를 구한다.
    • 그 개수를 result 배열에 추가한다.
  • 마지막으로 result 배열에서 가장 큰 값을 반환한다.

다른 풀이 1

function solution(strArr) {
  const counter = new Map();
  for (const str of strArr) {
    counter.set(str.length, (counter.get(str.length) || 0) + 1);
  }
  return Math.max(...counter.values());
}

나는 set을 사용했는데 map을 사용한 분의 풀이이다. set은 그래도 좀 많이 사용해서 익숙한데 map도 익숙해질 수 있도록 사용을 해봐야겠다.

  • counter라는 맵 객체를 생성한다.
  • for...of 반복문을 통해 strArr 배열을 순회한다.
  • 각 문자열에 대해서 다음 작업을 수행한다.
    • str.length를 키로 사용하여 counter 맵에 접근한다.
    • 해당 키가 이미 존재한다면 그 값을 가져와서 1을 더한다.
    • 존재하지 않는다면 0을 사용한다.
    • 업데이트 된 값을 다시 counter 맵에 저장한다.
  • 마지막으로 couter 맵의 모든 값 중 가장 큰 값을 반환한다.

다른 풀이 2

function solution(strArr) {
    let ans = Array(31).fill(0);
    for (let s of strArr) ans[s.length]++
    return Math.max(...ans)
}
  • ans 배열을 생성하여 모든 요소를 0으로 초기화한다. 문자열의 최대 길이가 30이기 때문에 배열의 크기를 31로 설정했다.
  • for...of 반복문을 통해 strArr을 순회한다.
  • 각 문자열에 대해 다음 작업을 수행한다.
    • s.length를 인덱스로 사용하여 ans배열의 해당 요소를 1증가시킨다.
  • 마지막으로 ans 배열에서 가장 큰 값을 반환한다.

Map 객체나 Set 등의 데이터 구조를 사용하지 않고 풀 수 있는 방식은 전혀 생각하지 못했다. 오...! ㅇㅅㅇ

profile
영차영차 😎

0개의 댓글