본문 바로가기
알고리즘/Programmers

[TIL] 2023.08.15 Programmers_문자열 묶기

by heereal 2023. 8. 15.

문자열 묶기

문제 설명

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

 

 

입출력 예

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

입출력 예 #1

  • 각 문자열들을 길이에 맞게 그룹으로 묶으면 다음과 같습니다.
문자열 길이 문자열 목록 개수
1 ["a","d"] 2
2 ["bc","hi"] 2
3 ["efg"] 1
  • 개수의 최댓값은 2이므로 2를 return 합니다.

 

나의 풀이

function solution(strArr) {
    const sortedArr = strArr.sort((a, b) => b.length - a.length);
    let numArr = strArr.reduce((arr, str) => { 
        arr[str.length - 1]++;
        return arr;
    }, Array(sortedArr[0].length).fill(0))
    return numArr.sort((a, b) => a - b)[numArr.length - 1];
}

처음부터 `reduce()`를 사용해서 풀어야겠다고 생각했고 거기에 코드를 붙이다 보니 많이 지저분해졌다..

  1. strArr 배열 안에서 가장 긴 문자열의 길이를 구하기 위해 각 요소의 문자열 길이 순으로 정렬한다. 
  2. `reduce()` 메서드를 이용하는데 초기값으로 가장 큰 문자열의 길이만큼 0을 요소로 가지는 배열을 초기값으로 설정한다. 예를 들면 [0, 0, 0, 0]
  3. `reduce()` 메서드를 실행하며 각 요소의 문자열 길이를 구해서, 초기값으로 설정한 배열에 해당 인덱스(현재 문자열의 길이)로 접근해 +1을 한다.
  4. `reduce()` 메서드의 결과 값 numArr를 다시 sort 해서 원소들을 길이가 같은 문자열들끼리 그룹으로 묶었을 때 가장 개수가 많은 그룹의 크기를 return 한다.

 

다른 사람의 풀이 01

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

문제의 제한사항에 각 원소의 최대 길이가 30으로 제시되어 있기 때문에 31의 길이를 가진 배열을 생성한다. 그리고 `Math.max()`를 이용해서 출력한 배열의 최댓값을 바로 찾는다. 

 

 

다른 사람의 풀이 02

function solution(strArr) {
    const aa = strArr.map((v)=>v.length)
    const count = {}
    for (let i = 0; i < aa.length; i++){
        count[aa[i]] = count[aa[i]] ? count[[aa[i]]] + 1 : 1;
    }
    return Object.values(count).sort((a,b)=>b-a)[0]
}

배열이 아닌 객체를 사용한 풀이 방법. 해당 풀이로 테스트 케이스를 실행했을 때 count로 {"1":2,"2":2,"3":1} 객체가 출력되는데 이 객체에 `Object.values()` 메서드를 이용해 객체의 value만 추출한 [2, 2, 1]로 변환한 후 `sort()` 메서드를 사용한다. 

 

사실 알고리즘 문제 풀 때 객체로 접근하는 방식은 거의 경험이 없는데 앞으로는 객체 사용에도 익숙해지도록 노력해야겠다.

 


Object.values()

const object1 = {
  a: 'somestring',
  b: 42,
  c: false,
};

console.log(Object.values(object1));
// Expected output: Array ["somestring", 42, false]

 

 

댓글