문제 설명

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 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

코드

이 문제는 다 풀어놓고 삽질했던 문제다…

문제를 정확하게 읽자 !!

기존 코드

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int solution(vector<int> array)
{
    int answer = 0;
    
    vector<int> num_list(1000, 0);
    
    for(const auto& n: array)
    {
        num_list[n]++;
    }
    
    auto max_iter = max_element(num_list.begin(), num_list.end());
    auto max_iter2 = max_element(max_iter+1, num_list.end());
    
    return *max_iter == *max_iter2 ? -1 : *max_iter;
}

1000개의 빈도를 나타내는 배열 num_list를 작성해놓고 array에서 해당 숫자 인덱스에 맞게 ++ 해주었다.

근데 아무리아무리 아무……….리 제출해도 틀렸다고 뜬다…

과연 무엇이 문제일까?!

답은.. 빈도를 출력하는 것이 아니라 빈도가 가장 높은 숫자를 출력하는 것이었다. ㅠㅠ

정답 코드

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int solution(vector<int> array)
{
    int answer = 0;
    
    vector<int> num_list(1000, 0);
    
    for(const auto& n: array)
    {
        num_list[n]++;
    }
    
    auto max_iter = max_element(num_list.begin(), num_list.end());
    auto max_iter2 = max_element(max_iter+1, num_list.end());
    
    if (*max_iter == *max_iter2)  return -1;
    else return std::distance(num_list.begin(), max_iter);
}

문제 핵심 포인트

  • 문제 똑바로 읽기

  • find 메소드에 대한 이해
    • <algorithm> 헤더에 포함
    • std::find( v.begin(), v.end(), 찾을 숫자 ) 로 사용,, 못 찾으면 v.end() 반환.
  • distance메소드에 대한 이해
    • <algorithm> 헤더에 포함
    • std::distance( v.begin(), iter 대입 ) 로 사용,, iter의 인덱스 값을 반환.

Reference

Leave a comment