최빈수 구하기

gcoco·2023년 5월 9일
0

안녕하세요! 치킨을 잔뜩 먹은 GCOCO입니다!


잡설 한 COOKIE🍪

언어를 잘 해야겠습니다!
갑자기 무슨소리냐구요? 그렇지만 요즘들어 제일 크게 느끼는 사실입니다,,,
삶을 살아가다보면 분명 누구에게나 한번쯤은 좋은 기회가 찾아온다고 생각합니다!
그런데 만약 그 기회가 외국으로부터 온 것이라면.......???😲😲😲

언어의 장벽에 막혀 좋은 기회를 잡지 못하고 날아가는것을 지켜보아야만 한다면 굉장히 굉장히! 아쉬울 것이라고 생각합니다. 또한 최근 취업준비를 하는 과정에서 영어공인성적을 따로 갖지 않고 있으니 불편한 점이 굉장히 많습니다.
인턴지원부터 시작하여 자소서 첨삭까지도 하물며 해외 기업에 지원하려 해도 영어 관련성적의 부재로 인한 고통을 상당히 겪고 있습니다! 그렇기에 최근에 다시 영어공부를 시작하였습니다.
수능을 볼 때 까지만해도 영어를 꽤나 잘한다고 생각했었는데요, 확실히 사용하지 않으니 무뎌지는것은 순식간입니다😅 모쪼록, 영어 공부에도 힘을 써서 좋은 소식을 들고올 수 있도록 노력해보겠습니다!

본론 시작하시죠!


문제 :

여러 개의 정수들이 주어졌을 때, 이 정수들 중에서 1 보다 크거나 같고 100 보다 작거나 같은 정
수들 중에서 가장 많이 입력된 수를 출력하는 프로그램을 작성하시오. 이 조건을 만족하며 가장
많이 입력된 정수가 한 개 이상인 경우에는 그 정수들 중에서 가장 큰 정수를 출력한다. 또한 이
조건을 만족하는 정수가 한 개도 없는 경우에는 0 을 출력한다. 입력되는 정수들 중에서 0 은 가
장 마지막에 오직 한 번만 입력된다


코드

참고로 이 문제엔 짚어볼 포인트가 여러 곳이 있습니다. 코드와 함께 같이 보시죠!

#include <iostream>
#include <string>
#include <map>
#include <algorithm> //sort함수 사용 위함
#include <vector>

using namespace std;
//사용자의 의도대로 정렬
bool cmp(const pair<int, int>& a, const pair<int, int>& b) {
    if (a.second == b.second)
        return a.first > b.first;
    return a.second > b.second;
    
}

int main() {
    int t;
    cin >> t;
    for (int i = 0; i < t; i++) {
        map<int, int> m;
        int num;
        while (cin >> num, num != 0) {
            if (1 <= num && num <= 100) {
                m[num]++;
            }
        }
        vector<pair<int,int>> tmp(m.begin(), m.end());
        sort(tmp.begin(), tmp.end(), cmp);

        if (!m.empty())
            cout << tmp[0].first << endl;
        else
            cout << 0 << endl;
    }
    return 0;
}

제가 쓴 코드의 step을 보자면 다음과 같습니다.

  1. 사용자로부터 num 입력을 받는다.
  2. num이 0이 아니라면 while문의 내부로 진입
  3. num이 1과 100 사이라면 만든 map에 추가하고 갯수 체크
  4. map 정렬을 위한 vector tmp를 만들고 이를 다시 cmp함수를 이용하여 정렬
  5. map이 비어있지 않다면 tmp[0]의 first 출력
  6. map이 비었다면 0출력

이런 과정이 되겠네요.
vector를 사용하지 않고 map을 순회하며 max값을 찾을수도 있었지만, value값 기준으로 정렬을 하는것을 되새겨보고자 사용했습니다!
unordered_map이 아닌 map 같은 경우 내부 정렬을 수행하게 되는데 이는 key값을 기준으로 오름차순으로 자동정렬이 됩니다.

map<int, int, greater<int>> m;

재밌게도 map의 선언에서 위와같이 선언해준다면, key 값을 내림차순으로 정렬할 수 있습니다.
하지만! 생각보다 key값이 아닌 value값을 이용하여 정렬을 하는 경우가 종종 발생하는데, 이때마다 까먹어서 곤혹을 치르곤 했습니다 하하.

vector<pair<int,int>> tmp(m.begin(), m.end());
sort(tmp.begin(), tmp.end(), cmp);

아시다싶이 map은 key와 value로 이루어져있습니다! 즉 한 쌍의 모습이라는 것이지요. 이를 입맞에 맞게 정렬하기 위해선 우선 다음과 같이 vector를 사용해야 합니다.

vector<pair<type,type>> v(m.begin(),m.end());

그릇을 옮기는 것이지요. 이후 sort 함수에서 cmp를 이용하여 정렬하기 위해 cmp 함수를 구성해주어야 합니다.

//사용자의 의도대로 정렬
bool cmp(const pair<int, int>& a, const pair<int, int>& b) {
    if (a.second == b.second)
        return a.first > b.first;
    return a.second > b.second;
    
}

cmp함수를 간단하게 봅시다! 우선 인자를 const의 형태로 받아왔습니다. a,b의 수정이 아닌 크기 비교만 하여 return 할 것이니 읽는 용도로만 사용하는것이죠. 내용을 살펴보면, 2번째 인자가 같으면 1번째 인자의 크기를 비교해서 return 하고, 기본적으로는 2번째 인자들의 비교를 하여 return한다. 이를 다시 적어보자면

범위 내의 숫자를 많이 입력된 순서로 내림차순으로 정렬하고, 만약 같은 값만큼 입력이 되었다면 큰 수를 기준으로 내림차순 하게끔 해 준것입니다.


작은 도움이라도 되었기를 바라며, 이번 포스팅 마치겠습니다!

profile
그코코 입니다.

0개의 댓글