-
프로그래머스 최빈값 구하기STUDY/Code TEST 2023. 7. 14.
[level 0] 최빈값 구하기 - 120812
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
성능 요약
메모리: 33.4 MB, 시간: 0.12 ms
구분
코딩테스트 연습 > 코딩테스트 입문
채점결과
Empty
문제 설명
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열
array
가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
제한사항
- 0 <
array
의 길이 < 100 - 0 ≤
array
의 원소 < 1000
입출력 예
array result [1, 2, 3, 3, 3, 4] 3 [1, 1, 2, 2] -1 [1] 1
입출력 예 설명
입출력 예 #1
- [1, 2, 3, 3, 3, 4]에서 1은 1개 2는 1개 3은 3개 4는 1개로 최빈값은 3입니다.
입출력 예 #2
- [1, 1, 2, 2]에서 1은 2개 2는 2개로 최빈값이 1, 2입니다. 최빈값이 여러 개이므로 -1을 return 합니다.
입출력 예 #3
- [1]에는 1만 있으므로 최빈값은 1입니다.
※ 공지 - 2022년 10월 17일 제한 사항 및 테스트케이스가 수정되었습니다.
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
코딩테스트 연습 | 프로그래머스 스쿨
개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!
school.programmers.co.kr
코드
function solution(array) { if(array.length === 1) return array[0] let obj = {} for(a of array){ if(obj[a] === undefined){ obj[a] = 1 }else{ obj[a] += 1 } } let result = Object.entries(obj).sort((a, b) => b[1] - a[1]) if(result.length === 1){ return Number(result[0][0]) }else if(result[0][1] === result[1][1]){ return -1 } return Number(result[0][0]) }
코드 설명
해결 방법을 구상한 순서는 이렇다.
1. result 값이 최빈값 숫자로 나오는 것으로 보아 배열 안의 숫자의 개수를 카운트 해야되겠네
2. 배열에 반복문을 돌려서 숫자를 key값으로 한 Object를 활용해 숫자별 개수를 카운트
3. key값과 value값을 분류해놓은 배열을 선언하고, sort 메소드로 value값 내림차순으로 정렬한다.
4. 인덱스가 0인 값이 최빈값 리턴
4-1. 최빈값이 여러 개 일 수 있으므로 인덱스 0과 1 을 비교
4-2. 만약 전체 배열에 똑같은 숫자 밖에 없다면 그 숫자를 배출. ex) [1, 1, 1, 1, 1]
4-3. 배열 안 값이 하나인 경우 그 값을 return
금방 풀 수 있을줄 알았는데, 메서드를 활용하는 부분에서 많이 막혔다 🥲
이 문제를 풀 때 막혔던 부분들이 두 번 있었는데, 하나는 객체의 key값과 value값을 배열로 만드는 법이고
두번째는 2차원 배열에서 sort 메서드로 value 값으로 정렬하는 부분이다.
결과값으로 최반값 숫자를 return 하려면 카운트 수만 sort 할 게 아니라 숫자도 같이 정렬되야 한다는 것을 깨닫고
잠깐동안 뇌정지가 왔었다. sort 메서드를 이때까지 폭 넓게 사용하지 못하고 단순히 일차원 배열에만 사용했었고
2차원에도 적용되는지와 배열 그룹에서 정렬할 대상을 하나만 지정할 수 있는지도 몰랐다.
문제 하나에서 많은 걸 알아갈 수 있어서 좋았다. 많이 써먹어야지
다른 사람의 풀이 코드
function solution(array) { let m = new Map(); for (let n of array) m.set(n, (m.get(n) || 0)+1); m = [...m].sort((a,b)=>b[1]-a[1]); return m.length === 1 || m[0][1] > m[1][1] ? m[0][0] : -1; }
딱 봐도 내 풀이코드와 덩치 차이가 극명하다.
그 이유를 찾아보면 맵 객체 메소드를 사용했다.
맵 객체 메소드는 키-값으로 이루어져 있으며, object와는 달리 키 type이 자유로워서
return 할 때 내 코드처럼 숫자형으로 일일히 바꿔주지 않아도 된다.
그리고 중간에 for (let n of array) m.set(n, (m.get(n) || 0)+1); 코드의 뜻은
array 배열의 각 요소를 순회하면서 각 요소의 등장 횟수를 맵 m 에 저장하는 것이다.
그래서 맵 m 은 각 요소를 키로 하고, 해당 요소의 등장 횟수를 값으로 갖는다
그리고 [...m] 에서 ... 는 전개 구문(spread operator)으로 m의 요소들을 새로운 배열로 변환한 것이다.
여기까지 코드에서 모르는 부분들을 정리해보았다.
크게 맵 객체, 로직, 전개 구문까지 있는데, 이것들은 따로 블로그에 정리를 해놓겠다!'STUDY > Code TEST' 카테고리의 다른 글
[Javascript] 프로그래머스 주사위의 개수 (0) 2023.08.22 [javascript] 프로그래머스 무작위로 K개의 수 뽑기 (1) 2023.07.27 프로그래머스 같은 숫자는 싫어 - 미완 (0) 2023.07.04 프로그래머스 최댓값 만들기 (2) (0) 2023.07.01 프로그래머스 가운데 글자 가져오기 (0) 2023.06.29 - 0 <