티스토리 뷰

Algorithm/Level 0

[Level 0] 문자열 등장 횟수

쩨리쩨리 2023. 7. 27. 08:17
반응형

문제 

숫자로 이루어진 문자열 s가 있습니다. 
이 문자열에서 가장 많이 등장하는 0 ~ 9 사이의 숫자를 출력하는 프로그램을 구현하세요.
단, 가장 많이 등장하는 수가 여러 개라면, 그 중 가장 작은 수를 반환하세요.

 

입력 형식

  • s 는 숫자로 이루어진 문자열 

 

출력 형식

  • 가장 많이 등장하는 수를 정수로 반환 

 

제약 사항 

  • 0 < s.length <= 100

 

입출력 예시 

  • 예시1
  • 입력 : s = "174771177"
  • 출력 : 7
  • 설명 : 7이 가장 많이 등장하였으므로 답은 7이다.

 

  • 예시2
  • 입력 : s = "552342502"
  • 출력 : 2
  • 설명 : 2와 5가 가장 많이 등장하지만, 2가 더 작으므로 2를 반환 

 


내 풀이

function solution(s) {
    const setArr = [...new Set(s)].sort((a,b) => a-b);
    let max = 0;
    let result = 0;
    setArr.forEach((v) => {
        let count = [...s].reduce((a,c) => c === v ? a += 1 : a, 0);
        if(max < count) {max = count; result = +v}
        else if (max === count) {
            result = Math.min(result, +v);
        }
    });

    return result;
}

 

  • 시간 복잡도 : O(n^2)
  • 설명 : 해당 코드는 문자열 s를 중복을 제거한 후 정렬하여 setArr 배열에 저장한다. 그리고 setArr 배열을 순회하면서 각 문자(v)가 s에 몇 번 등장하는지 세는데, 이를 위해 또 다시 s를 배열로 만들어 reduce 메서드를 사용한다. 이렇게 되면 각 문자마다 다시 전체 문자열을 검사하므로 시간 복잡도가 O(n)인 reduce 메서드를 setArr의 길이만큼 호출하게 된다. 이는 효율적이지 않은 방법이며, 특히 문자열이 매우 긴 경우에는 성능이 더욱 저하될 수 있다.

 


해결 방법

function solution(s) {
  const charCounts = new Map();

  for (const char of s) {
    if (charCounts.has(char)) {
      charCounts.set(char, charCounts.get(char) + 1);
    } else {
      charCounts.set(char, 1);
    }
  }

  let maxCount = 0;
  let resultChar;

  charCounts.forEach((count, char) => {
    if (count > maxCount) {
      maxCount = count;
      resultChar = char;
    } else if (count === maxCount && char < resultChar) {
      resultChar = char;
    }
  });

  return resultChar;
}

 

  • 시간 복잡도 : O(n)
  • 설명 : 해결 방법으로는 문자열을 한 번만 순회하면서 각 문자의 등장 횟수를 세는 방법이 있다. 이렇게 하면 중복 계산을 피할 수 있으며, 시간 복잡도를 O(n)으로 개선할 수 있다. ⇒ 문자의 등장 횟수를 세는 방법으로 map을 사용하자.
반응형

'Algorithm > Level 0' 카테고리의 다른 글

[Level0] 약수 구하기  (0) 2024.01.12
[Level 0] 정수 배열의 최대 공약수  (0) 2023.08.03
[Level 0] 숫자 빈도수  (0) 2023.08.02
[Level 0] 팬그램(pangram)  (0) 2023.07.27
[Level 0] 정수 반복 계산  (0) 2023.07.27
댓글
공지사항