페블_
반짝이는 시냅스
페블_
전체 방문자
오늘
어제
  • 전체글 보기 (96)
    • QA (0)
    • 프로젝트 회고 (4)
    • 프로젝트 과정 기록 (12)
    • UI 구현 연구일지 (8)
    • Front-end (31)
      • Javascript (7)
      • CSS (10)
      • React (5)
      • Typescript (3)
      • Nextjs (3)
      • 스타일링 라이브러리 (3)
    • Back-end (0)
      • Express (0)
      • DB (0)
    • CS (0)
      • 자료구조 & 알고리즘 (0)
    • CI&CD (1)
    • 툴 사용법 (4)
      • Git (1)
      • Library&패키지 (2)
      • 기타 개발관련 (1)
    • 알고리즘 이론 & 풀이 (36)
      • 백준(BOJ) (14)
      • 프로그래머스 (22)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • chartjs
  • react
  • TypeScript
  • 선형대수학
  • JS
  • eslint
  • 캐러셀
  • emotion
  • storybook
  • UI 컴포넌트
  • 백준
  • 파이썬
  • 시리즈_표지
  • 알고리즘
  • Python
  • 개발블로그_시작
  • 토이프로젝트
  • 생각

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
페블_

반짝이는 시냅스

알고리즘 이론 & 풀이/프로그래머스

프로그래머스 Lv.0 | 최빈값 구하기

2023. 7. 5. 01:01

문제

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

 

 

💻 풀이

  1. 최빈값을 count하기 위해 Map() 객체로 값 - 빈도수 쌍을 저장할 것이다. get()으로 쉽게 해당 값의 빈도수를 참조할 수 있기 때문이다.
  2. 주어진 숫자 배열을 돌며 최빈값을 기록하는 Map 객체에 현재 숫자가 저장되어 있다면 횟수를 +1 하고, 없다면 새로 추가한다.
  3. Array.from으로 Map을 배열로 만든 다음, 오름차순 정렬한다.
  4. 맨 뒤와 뒤에서 두번째값을 비교해서 숫자가 같다면 최빈값이 여러개이므로 -1을 반환하고, 아니라면 가장 큰 값인 맨 뒷 값을 반환한다.
    ...는 아이디어인데 여기에 함정이 있다. 맨 뒤와 뒤에서 두번째값을 비교하려다가 같은 숫자만 여러여서 빈도수를 카운팅 한 결과의 길이가 1인 경우에는 인덱스 에러가 날 수 있다. 그것을 고려해서 뒤에서 가장 큰 값 두개를 비교하기 전에, 길이가 1인지 체크하는 로직을 넣자.

 

❌ 테스트 8, 9번 런타임 에러

맨 처음에 풀었던 코드는 이랬는데 테스트 8, 9번 런타임 에러가 났다. 내가 놓친 점이 뭔지 찾아봤는데

나는 단일 숫자만 있는 경우를 array.length 1일거라고 가정하고 바로 return하도록 코드를 짰지만,

[3, 3, 3, 3, 3] 처럼 같은 숫자가 여러 개 있는 경우를 생각하지 못했다.

마지막 줄의 return문에서 배열의 맨 마지막과 뒤에서 두 번째 배열을 비교해서 동일한 값이 있는지 검사하는 로직이 있는데, 없는 인덱스를 참조하려고 했기 때문에 런타임 에러가 났던 것이다.

function solution(array) {
    if(array.length === 1) return array[0];
    const count = new Map();
    array.forEach(num => count.get(num) ? count.set(num, count.get(num) + 1) : count.set(num, 1));
    const sorted = Array.from(count).sort((a, b) => a[1] - b[1]);
    return sorted[sorted.length - 1][1] === sorted[sorted.length - 2][1] ? -1 : sorted[sorted.length - 1][0];
}

 

✅ 고친 풀이

function solution(array) {
    const count = new Map();
    array.forEach(num => count.get(num) ? count.set(num, count.get(num) + 1) : count.set(num, 1));
    const sorted = Array.from(count).sort((a, b) => a[1] - b[1]);
    if(sorted.length === 1) return sorted[0][0];
    return sorted[sorted.length - 1][1] === sorted[sorted.length - 2][1] ? -1 : sorted[sorted.length - 1][0];
}

'알고리즘 이론 & 풀이 > 프로그래머스' 카테고리의 다른 글

프로그래머스 Lv.0 | 구슬을 나누는 경우의 수  (0) 2023.07.07
프로그래머스 Lv.0 - 직각삼각형 출력하기 +) nodejs readline  (0) 2023.07.06
프로그래머스 Lv.0 | 분수의 덧셈  (0) 2023.07.02
프로그래머스 Lv.0 | 자릿수 더하기  (0) 2023.06.30
프로그래머스 Lv.0 | 캐릭터의 좌표  (0) 2023.06.29
    '알고리즘 이론 & 풀이/프로그래머스' 카테고리의 다른 글
    • 프로그래머스 Lv.0 | 구슬을 나누는 경우의 수
    • 프로그래머스 Lv.0 - 직각삼각형 출력하기 +) nodejs readline
    • 프로그래머스 Lv.0 | 분수의 덧셈
    • 프로그래머스 Lv.0 | 자릿수 더하기
    페블_
    페블_

    티스토리툴바