문제
https://school.programmers.co.kr/learn/courses/30/lessons/120812
💻 풀이
- 최빈값을 count하기 위해 Map() 객체로 값 - 빈도수 쌍을 저장할 것이다. get()으로 쉽게 해당 값의 빈도수를 참조할 수 있기 때문이다.
- 주어진 숫자 배열을 돌며 최빈값을 기록하는 Map 객체에 현재 숫자가 저장되어 있다면 횟수를 +1 하고, 없다면 새로 추가한다.
- Array.from으로 Map을 배열로 만든 다음, 오름차순 정렬한다.
- 맨 뒤와 뒤에서 두번째값을 비교해서 숫자가 같다면 최빈값이 여러개이므로 -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 |