알고리즘/프로그래머스 1단계

프로그래머스 - 최빈값 구하기 - C++

게임만드는학생 2023. 9. 7. 15:55

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

 

프로그래머스

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

programmers.co.kr

 

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

int solution(vector<int> array) {
    int answer = 0;
    map<int, int> m;

    if (array.size() == 1)
        return array[0];
    for (int i = 0; i < array.size(); i++)
    {
        if (m.find(array[i]) != m.end())
        {
            m[array[i]]++;
        }
        else
        {
            m.insert({ array[i],1 });

        }
    }
    int maxId = 0;
    bool ch = false;
    for (int i = 1; i < m.size(); i++)
    {
        if (m[i] > m[maxId])
        {

            maxId = i;
            ch = false;
        }
        else if (m[i] == m[maxId])ch = true;
    }
    if (ch)return -1;
    if (m.size() == 1)
        return m.find(array[0])->first;
    return maxId;
}


설명

map, m.find()

주어진 배열에서 최빈값을 구하는 문제이다.

자료구조로 map 을 떠올렸다. 

<key,value> 로 이루어진 자료구조로 key를 통해 검색이 가능하다. 

 

따라서 먼저 array 배열을 map 에 저장하는 과정이다. 

if (array.size() == 1)
        return array[0];
    for (int i = 0; i < array.size(); i++)
    {
        if (m.find(array[i]) != m.end())
        {
            m[array[i]]++;
        }
        else
        {
            m.insert({ array[i],1 });

        }
    }

맨 처음 if문은 배열 크기가 1이면 바로 리턴하도록 예외처리한 것이다. 

 

for문으로 array를 하나씩 보면서 m.find 함수로 map 에서 key값을 통해 검색하는 기능이다.

만약 값이 없다면 m.end()를 리턴한다. 

만약 키 값이 있다면 그 개수를 1증가시킨다. 

그리고 없다면 insert로 그 키를 넣어준다. 

 

ex) array 배열이 {1,1,2,3,4} 면

map 은 (key , value로) [ {1,2}, {2,1},{3,1},{4,1}] 이 된다. 

1은 2개 2는 1개 .... 라는 뜻이다.

 

참고로 m[1]을 통해 1번키를 갖고 있는 m 원소에 접근이 가능하다. 

 

map 자료구조를 만들었다면 이제는 최빈값을 찾아야한다. 

이 때, value 값이 가능 큰 것을 찾으면 된다. 

 

int maxId = 0;
    bool ch = false;
    for (int i = 1; i < m.size(); i++)
    {
        if (m[i] > m[maxId])
        {

            maxId = i;
            ch = false;
        }
        else if (m[i] == m[maxId])ch = true;
    }
    if (ch)return -1;
    if (m.size() == 1)
        return m.find(array[0])->first;
    return maxId;

for문으로 맵의 원소를 하나씩 보면서 가장 큰 것의 key값을 maxId에 저장한다. 

왜냐하면 최빈값의 개수가 아닌 최빈값을 찾는 것이기 때문이다. 

 

for 문 안에 else if 문은 최빈값이 여러개인 경우를 나타내기 위해서이다. 

현재 가장 큰 값이 maxId에 들어있는데 똑같은 것이 나오면 else if문이 참이 된다. 

이 때, ch변수를 true 로 바꿔서 최빈값이 여러개라는 것을 표시한다. 

 

그리고 더 높은 숫자가 나오면 다시 ch를 false 로 바꾼다. 

 

for문을 1부터 도는 이유는 maxId 가 0을 초기값으로 가져 처음에 else if문이 참이 되기 때문이다. 

그래서 1부터 돌고 예외처리로 

if (m.size() == 1)
        return m.find(array[0])->first;

사이즈가 하나인 경우 for문을 돌지 못하기 때문에 이 코드를 넣었다.