저장을 습관화

프로그래머스 LV.0 문자열 묶기 본문

코딩 테스트/프로그래머스 - 자바스크립트

프로그래머스 LV.0 문자열 묶기

ctrs 2023. 9. 28. 01:09

프로그래머스 LV.0 문자열 묶기

https://school.programmers.co.kr/learn/courses/30/lessons/181855

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 명

문자열 묶기


2. 문제 설명

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


3. 제한 사항

- 1 ≤ strArr의 길이 ≤ 100,000

- 1 ≤ strArr의 원소의 길이 ≤ 30

- strArr의 원소들은 알파벳 소문자로 이루어진 문자열입니다.

 

4. 예시

strArr result
["a","bc","d","efg","hi"] 2


5. 기본 제공 코드

function solution(strArr) {
    var answer = 0;
    return answer;
}


6. 제출한 내 답

const solution = (strArr) => {
  let max = strArr.map((v) => {
    return (v = v.length);
  });

  let arr = Array(Math.max(...max) + 1).fill(0);

  strArr.forEach((v) => {
    return (arr[v.length] += 1);
  });
  return Math.max(...arr);
};

 

6-2. VSC에 작성한 내용

const solution = (strArr) => {
  let max = strArr.map((v) => {
    return (v = v.length);
  });

  let arr = Array(Math.max(...max) + 1).fill(0);

  strArr.forEach((v) => {
    return (arr[v.length] += 1);
  });
  return Math.max(...arr);
};

// 테스트
console.log(solution(["a", "bc", "d", "efgdfsdfsdf", "hi"]));


7. 특이사항

일단 통과는 했는데 코드가 마음에 들지 않는다.

최빈값을 구하는 알고리즘을 혼자서 생각해내지 못해 구글링 하였다

분하다

 

우선 남이 작성한 코드를 토대로 아래와 같이 작성하였다.

const solution = (strArr) => {
  let arr = Array(strArr.length).fill(0);
  strArr.forEach((v) => {
    return (arr[v.length] += 1);
  });

  return Math.max(...arr);
};

 

위 코드는 배열 arr의 길이를 매개변수 strArr의 길이를 기준으로 작성하는데

제한사항에 보면 strArr의 길이는 1이상 10만 이하이고,

strArr의 원소의 길이는 1 이상 30 이하이다.

 

이 경우 strArr이 ["asdfasdfasdf", "s"] 와 같은 상황,

즉 strArr의 요소의 길이가 strArr의 길이보다 더 길 상황에서는

아래와 같은 에러가 발생할 수 있다.

let a = [0, 0, 0, 0, 0];

a[10] += 1;

console.log(a); // [ 0, 0, 0, 0, 0, <5 empty items>, NaN ]

 

이 에러를 잡기 위해 매개변수 strArr의 요소 중 길이가 가장 긴 것을 변수 max에 할당하였고

배열은 0부터 시작하므로 Array(Math.max(...max) + 1)의 길이를 가지는 배열을 생성하였다.

이 배열은 strArr의 요소의 각 길이가 몇번 등장하였는지 횟수를 저장할 역할을 한다.

 

let max = strArr.map((v) => {
    return (v = v.length);
  });

  let arr = Array(Math.max(...max) + 1).fill(0);

 

하지만 처리해아할 내용이 늘어남에 따라 실행시간도 길어지게 되었다.

테스트 1 〉	통과 (4.66ms, 48.8MB)
테스트 2 〉	통과 (0.14ms, 33.5MB)
테스트 3 〉	통과 (4.99ms, 50.8MB)
테스트 4 〉	통과 (5.98ms, 50.5MB)
테스트 5 〉	통과 (5.50ms, 48.5MB)
테스트 6 〉	통과 (1.56ms, 37.6MB)
테스트 7 〉	통과 (5.52ms, 50.8MB)
테스트 8 〉	통과 (2.63ms, 38.2MB)
테스트 9 〉	통과 (3.82ms, 45.2MB)
테스트 10 〉	통과 (0.73ms, 34.8MB)
테스트 11 〉	통과 (0.53ms, 34.3MB)
테스트 12 〉	통과 (4.05ms, 47.1MB)
테스트 13 〉	통과 (6.45ms, 52.9MB)
테스트 14 〉	통과 (2.82ms, 39.5MB)
테스트 15 〉	통과 (3.38ms, 44.9MB)
테스트 16 〉	통과 (2.27ms, 39.5MB)
테스트 17 〉	통과 (3.55ms, 45.6MB)
테스트 18 〉	통과 (2.82ms, 40.6MB)
테스트 19 〉	통과 (3.34ms, 44.8MB)
테스트 20 〉	통과 (5.22ms, 49.9MB)
테스트 21 〉	통과 (5.30ms, 49.3MB)
테스트 22 〉	통과 (4.87ms, 47.4MB)
테스트 23 〉	통과 (2.99ms, 41.5MB)
테스트 24 〉	통과 (9.54ms, 50.7MB)

 


8. 다른 사람이 작성한 답

8-1. 좋아요를 가장 많이 받은 풀이법

function solution(strArr) {
    let ans = Array(31).fill(0);
    for (let s of strArr) ans[s.length]++
    return Math.max(...ans)
}

제한사항은 strArr의 원소의 최대 길이가 30이므로 저장용 배열의 길이를 31로 지정하였다

당장은 괜찮겠지만 문제가 개편된다면 수정해야할텐데

 

8-2. map

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());
}

new Map()은 처음 보는 함수이다.

더 공부한 후 정리해야겠다