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문을 돌지 못하기 때문에 이 코드를 넣었다.
'알고리즘 > 프로그래머스 1단계' 카테고리의 다른 글
프로그래머스 - 특이한 정렬 - C++ (0) | 2023.09.09 |
---|---|
프로그래머스 - 다음에 올 숫자 - C++ (0) | 2023.09.08 |
프로그래머스 - 종이 자르기 - C++ (0) | 2023.09.06 |
프로그래머스 - 문자열 밀기 - C++ (0) | 2023.09.05 |
프로그래머스 - 캐릭터의 좌표 - C++ (0) | 2023.09.04 |