[C++] 백준 1302 베스트셀러
2021. 3. 27.
반응형

www.acmicpc.net/problem/1302

 

1302번: 베스트셀러

첫째 줄에 오늘 하루 동안 팔린 책의 개수 N이 주어진다. 이 값은 1,000보다 작거나 같은 자연수이다. 둘째부터 N개의 줄에 책의 제목이 입력으로 들어온다. 책의 제목의 길이는 50보다 작거나 같고

www.acmicpc.net

 

1. 서론

 

어렵지 않다. 문제를 자세히 읽고 집중력이 흐트러지지 않은 상태라면.

 

2. 문제풀이

 

하루에 팔린 책의 수가 입력된다. 그리고 그 수만큼 책의 제목이 입력된다. 입력을 받고 하루에 가장 많이 팔린 책의 제목을 출력하는 게 문제이다. 여기서 주의할 점은 가장 많이 팔린 책의 개수가 같은 경우에는 사전 순으로 앞인 책의 제목을 출력해야 한다.

 

나 같은 경우에는 일단 처음에 사전 순을 못 봐서 헤맸고, 그다음에는 index값을 책의 개수를 count 한 값으로 넣어서 뭐가 오류가 나서 틀린 지를 모르고 한참을 헤맸다. (바보 같음)

 

pair로 문자열과 책의 개수를 만들었다. 책 하나가 처음에 입력될 때 책의 개수를 1로 해서 같이 넣고 다음 문자열이 또 들어올 때 원래 벡터에 책이 있는지 없는지 검사 후 없으면 넣고, 있으면 책의 개수를 +1 하는 식으로 만들었다.

그렇게 벡터가 완성되면 책의 개수를 검사 후 가장 큰 값을 고르는데 이때 사전 순으로 가장 앞에 있는 것이 오게 해 준다.

 

3. 코드 설명

 

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int main()
{
    string s;
    vector<pair<string,int> > v;
    int n, i, j, f = 0, m = 0, x = 0;

    cin >> n;

    for (i = 0; i < n; i++)
    {
        cin >> s;

        for (j = 0; j < v.size(); j++)
        {
            if (v[j].first == s)
            {
                f = 1;
                v[j].second++;
                break;
            }
        }
        
        if (f != 1)
            v.push_back(make_pair(s, 1));     
        
        f = 0;
    }
    
    for (i = 0; i < v.size(); i++)
    {
        if (m < v[i].second || (m == v[i].second && v[x].first > v[i].first))
        {
            m = v[i].second;
            x = i;
        }   
    }

    cout << v[x].first << endl;
}

 

문자열을 입력받는다. 그리고 벡터에 그 문자열이 있는지 없는지 확인 후 있으면 f = 1로 바꾸고 책의 개수를 +1 해준다. 

f값은 책의 제목을 추가할지, 말지 정하기 위해 쓰인다. 그러기 위해서 반복문이 한 번 끝날 때마다 f를 0으로 초기화해준다.

책의 입력이 끝난 후 가장 많은 책을 찾는다. 이때 책의 개수가 같은 경우 사전 순으로 앞쪽인지 판별하기 위해 조건을 걸어준다.

 

 

 

 

 

반응형

'Algorithm' 카테고리의 다른 글

[C++] 백준 1668 트로피 진열  (0) 2021.03.27
[C++] 백준 1568 새  (0) 2021.03.27
[C++] 백준 1543 문서 검색  (0) 2021.03.26
[C++] 백준 11004 K번째 수  (0) 2021.03.26
[C++] 백준 2003 수들의 합 2  (0) 2021.03.10
myoskin