[c++]백준11098번:첼시를 도와줘!

https://www.acmicpc.net/problem/11098

 

11098번: 첼시를 도와줘!

구단이 성적을 내지 못한다면 답은 새 선수 영입뿐이다. 이것은 오늘날 유럽 리그에서 가장 흔한 전략이고, 노르웨이의 로젠버그 팀은 이러한 전략이 성공한 대표적 예시다. 그들은 많은 스카

www.acmicpc.net


가장먼저 떠오른 방법

:

c를 이용하여, max(정답)에 해당하는 가격&이름을 담을 수 있는 변수를 선언해서 저장해두고 출력하기

 

하지만 c++의 장점을 살리지 못한 코드일 뿐더러, 선언한 변수도 많아 비효율적이라는 생각이 들었다.

#include <iostream>
#include <vector>
#include <cmath> //C++

using namespace std;

int main(int argc, char** argv)
{
    int n;
    cin >> n;

    int p;
    for (int i = 0; i < n; i++) {
        cin >> p;
        // 가격과 이름을 p번 입력받기
        // max 가격 저장 필요

        int price = 0;  
        int max_price = 0;  // 매 테스트케이스마다 최대 가격 초기화
        string name;
        string max_name;

        for (int j = 0; j < p; j++) {
            cin >> price >> name;
            if (price > max_price) {
                max_price = price;
                max_name = name;
            }
        }

        cout << max_name << endl;       // 테스트 케이스별로 결과 출력
    }

    

    return 0;
}

다르게 접근해본 방법

:

가격과 이름을 따로따로 저장하는 것보다는, 동시에 묶어서 한쌍으로 저장하는 방법을 고려해보았다.

 

vector<pair<int,string>> testcase(p);

 

vector와 pair를 이용하면 가격과 이름을 쌍으로 한 번에 저장할 수 있다.

여기서 p는 문제상 테스트케이스에서의 쌍의 개수를 의미하는데,

길이가 p고(=쌍의 총 개수) 이름이 'testcase'인 vector를 선언해서 사용했다.

 

#include <iostream>
#include <vector>
#include <cmath> //C++

using namespace std;

int main(int argc, char** argv)
{
    int n;
    cin >> n;

    int p;
    for (int i = 0; i < n; i++) {
        cin >> p;	// 가격과 이름을 p번 입력받기

        vector<pair<int, string>> testcase(p);  // // 길이가 p인 pair 타입의 벡터 testcase를 생성

        int max_price = 0;  // 테스트케이스마다 최대가격및 이름 초기화
        string max_name;
        for (int j = 0; j < p; j++) {
            cin >> testcase[j].first >> testcase[j].second;
            if (testcase[j].first > max_price) {
                max_price = testcase[j].first;      // max_price와 max_name대신에 max를 기억하는 인덱스 변수 1개로 대체해도 될듯
                max_name = testcase[j].second;
            }
        }

        cout << max_name << endl;       // 테스트 케이스별로 결과 출력
    }

    

    return 0;
}

 

 

이 코드에서는 가격이 최대인경우의 가격과 이름을 변수를 따로두어 저장했는데,

풀고나니 차라리 '쌍'이라는 점을 이용하여 최대인 '쌍'에 해당하는 인덱스를 기억해두는 방법이

사용할 변수의 개수가 줄어든다는 면에서 더 효율적이라는 생각이 들었다.

 

그래서 수정한 코드.

// 첫번째 for문 안의 내용 변경 
int max_index = 0;		// int max_price와 string max_name 대신 사용
        for (int j = 0; j < p; j++) {
            cin >> testcase[j].first >> testcase[j].second;
            if (testcase[j].first > testcase[max_index].first) {
                max_index = j;
            }
        }

 


깨달은 점

:

가장 먼저 떠오른 방법으로 풀어보되,

메모리(공간)을 더 효율적으로 쓸 수 있는 방법이 있는지

다음에도 비슷한 문제를 맞닥뜨린다면 고려해봐야 겠다.

'코딩테스트 공부' 카테고리의 다른 글

[c++]백준1920번: 수 찾기  (0) 2023.09.12
[c++]백준1158번:요세푸스 문제  (0) 2023.09.10
[c++]백준1427번:소트인사이드  (0) 2023.09.03
[c++] 벡터  (0) 2023.07.08