본문 바로가기
[ Computer Science ]/Algorithm_C++

[프로그래머스/C++] 최빈값 구하기

by dev charlotte 2024. 2. 4.

0. 문제

풀이한 문제 - 최빈값 구하기 (프로그래머스 입문 / Lv.0 / 정답률 68%)

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 테스트 케이스 분석

테이블 하단 파란색 예시들은

문제에 제시된 테스트 케이스 이외에 내가 추가한 예시다

 

해당 문제에서는 1개 있든 여러 개 있든

가장 많은 개수의 숫자가 최빈값이고

최빈값이 여러 개면 -1을 리턴하고

최빈값이 하나면 그 값을 리턴하는 문제다

 

문제 자체는 정말 단순했는데

코테 연습이 많이 되어있지 않은 초보 상태라

구현하는 것에 어려움이 있었다

 

2. 코드 및 풀이

일단 입력 받은 벡터를 정렬부터 했다

sort 함수를 사용하기 위해 <algorithm> 라이브러리를 include 했다

 

sort 함수 사용방법 -> sort(시작주소,끝주소)

- 배열 : sort(arr, arr+arrSize);

- 벡터 : sort(v.begin(), v.end());

 

최빈값이 여러 개인 경우가 있을 수 있으니

최빈값들을 저장하는 modes 벡터를 선언했다

 

cnt 변수는 해당 수의 빈도를 저장하고

mode_cnt는 최빈값의 빈도,

before은 직전의 최빈값을 저장한다

 

벡터의 크기만큼 반복하는 반복문 내부에

조건문을 작성해서 최빈값을 찾았다

 

i == 0인 경우 벡터의 첫번째 인덱스 값이므로 

해당 값의 빈도인 cnt = 1,

첫번째 값이라 일단 이 값이 최빈값이니까

최빈값 저장 벡터인 modes 에 push back 하고

이전 벡터값 변수에도 해당 값을 저장하고

최빈값의 횟수 벡터에도 한 번이므로 1을 저장한다

 

 

벡터의 크기가 1인 경우만 있는 것이 아니니까

i != 0인 경우 최빈값을 구하는 과정을 조건문으로 작성했다

 

현재 최빈값의 횟수보다 지금 값의 횟수가 더 많다면

최빈값 갱신이 필요하다

이전에 저장해두었던 값은 더이상 최빈값이 아니게 되므로

modes 벡터를 초기화 시키고

지금 찾은 최빈값 (array[i]) 을 modes 벡터에 추가한다

현재 최빈값의 횟수 또한 지금 값의 횟수로 갱신해준다

 

값의 빈도가 모두 다른 경우만 있는 것은 아니고

최빈값과 빈도가 같은 숫자를 발견한 경우도 있을 것이다

현재 최빈값과 빈도가 같은 숫자라면 

이 값 또한 최빈값이므로 

modes 벡터에 추가한다

 

 

 

반복문이 끝난 후

저장된 최빈값들의 개수를 확인하기 위해

modes 벡터의 크기를 확인해보면

1인 경우는 최빈값이 하나이므로 그 값을 리턴하고

1이 아닌 경우는 최빈값이 여러 개인 것이므로 -1을 리턴한다

 

 

 

해당 게시글에 사용된 PPT 이미지는

모두 직접 제작했습니다