저장을 습관화
프로그래머스 LV.0 문자열 묶기 본문
프로그래머스 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()은 처음 보는 함수이다.
더 공부한 후 정리해야겠다
'코딩 테스트 > 프로그래머스 - 자바스크립트' 카테고리의 다른 글
프로그래머스 LV.1 약수의 개수와 덧셈 (0) | 2023.09.28 |
---|---|
프로그래머스 LV.0 7의 개수 (0) | 2023.09.28 |
프로그래머스 LV.0 이진수 더하기 (0) | 2023.09.27 |
프로그래머스 LV.0 컨트롤 제트 (0) | 2023.09.27 |
프로그래머스 LV.0 리스트 자르기 (0) | 2023.09.27 |