문자열 묶기
https://school.programmers.co.kr/learn/courses/30/lessons/181855
나의 풀이
function solution(strArr) {
let lengths = strArr.map(e => e.length)
let lengthObj = {}
for(let length of lengths){
let key = length
if(!lengthObj[key]){
lengthObj[key] = 0
}
lengthObj[key] += 1
}
let maxCount = 0;
let maxValue = null
for (let key in lengthObj) {
if (lengthObj.hasOwnProperty(key)) {
if (lengthObj[key] > maxCount) {
maxCount = lengthObj[key];
maxValue = key;
}
}
}
return maxCount;
}
- 문자열의 길이들을 모은 배열을 따로 구한다.
- 문자열 길이를 키로 나눈 객체를 만들기 위하여 빈 객체를 선언한다.
- 해당 길이 배열 요소를 객체의 key로 만들어주고, 같은 배열의 길이가 나타날 때마다 카운트 +1을 해준다.
- 예시인 ["a","bc","d","efg","hi"]을 기준으로 설명하자면 길이만 모은 배열 [1, 2, 1, 3, 2]가 lengths로 선언되고, 이 각각의 요소들 1, 2, 3이 객체의 키가 된다.
- 마지막으로 maxCount를 선언하여 가장 count가 높은 수를 for문으로 순회하면서 찾아내는 코드이다.
다른 사람의 풀이
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());
}
- 프로그래머스 다른 사람의 풀이에서 본 코드인데, 내가 의도하고 싶었던 코드였다.
- counter라는 Map 객체를 생성한다. 문자열의 길이를 키로 하며 해당 길이의 문자열이 등장한 횟수를 값으로 저장한다.
- strArr 배열을 순회하면서 각 문자열(str)의 길이를 확인한다.
- counter.get(str.length)를 사용하여 해당 길이의 값(등장 횟수)을 가져온다. 만약 값이 undefined인 경우, 기본값으로 0을 사용한다.
- 가져온 값에 1을 더한 후, 다시 counter map에 해당 길이의 키와 증가된 값을 설정한다.
- Math.max(...counter.values())를 사용하여 추출한 값들 중 가장 큰 값을 반환한다. 이 값은 가장 많이 등장하는 문자열의 길이를 의미한다.
if(!lengthObj[key]){ lengthObj[key] = 0 } 또는,
counter.get(str.length) || 0 을 하는 이유?
만약 초기값이 없는 상태에서 값을 증가시키려고 하면 undefined에 1을 더하는 연산이 되기 때문이다. undefined에 1을 더하면 NaN (Not a Number)이 되는 결과를 가져온다.
따라서 초기값을 설정해주지 않으면, 해당 키가 존재하지 않는 경우에는 적절한 초기값이 없어 연산이 제대로 이루어지지 않고 예상치 못한 결과인 NaN이 되는 문제가 발생한다.
그러므로 초기값을 0으로 설정하여 해당 키가 존재하지 않는 경우에도 값을 증가시킬 수 있도록 하는 것이 안전하고 정확한 동작을 보장하기 위한 방법이다.
'JS > 알고리즘(코테)' 카테고리의 다른 글
프로그래머스 코딩테스트 LV.0 - 외계어 사전 (0) | 2023.06.05 |
---|---|
프로그래머스 코딩테스트 LV.0 - 두 수의 합 (0) | 2023.06.04 |
프로그래머스 코딩테스트 LV.0 - 공 던지기, 배열의 길이를 2의 거듭제곱으로 만들기 (0) | 2023.05.31 |
프로그래머스 코딩테스트 LV.0 - 1로 만들기, 날짜 비교하기, 이진수 더하기 (0) | 2023.05.31 |
프로그래머스 코딩테스트 LV.0 - 배열 만들기4 (0) | 2023.05.31 |