관리 메뉴

cococo-coding

[C++ 풀이] 1026번. 보물 본문

[BOJ] 코드 모음/C++_learning 문제집

[C++ 풀이] 1026번. 보물

_dani 2024. 1. 17. 19:11

문제

풀이

벡터와 sort정렬을 이용한다. 


n을 입력받는데, 이때 n은 정수 배열 A와 B의 크기인데 배열의 크기를 n으로 넣을 수 없으므로 벡터를 사용했다.

vector <int> avec(n);
vector <int> bvec(n);

위와 같이 A벡터(avec)와 B벡터(bvec)를 선언하고, 크기는 입력받은 n을 그대로 넣어준다.

 

for문을 이용해 각각의 원소들을 입력받는다. 

배열과 동일하게 avec[i], bvec[i]로 써주면 된다.

 

a벡터는 내림차순으로, b벡터는 올림차순으로 정렬한 후에 각 원소끼리 곱해주면

S의 최솟값을 구할 수 있다. 

 

a벡터의 입력값 > 1 1 1 6 0 

b벡터의 입력값> 2 7 8 3 1

-----------------------------------------

a벡터 내림차순으로 정렬> 6 1 1 1 0

b벡터 올림차순으로 정렬> 1 2 3 7 0

-------------------------------------------------

a벡터*b벡터의 결과> 6 2 3 7 0

 

다시 for문을 이용해 sum에 결과값을 누적시켜 더해준후에, sum을 출력한다. 

 

코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*
    sort정렬을 이용하자
    1. n을 입력받는다.
    2. A의 숫자들, B의 숫자들을 n개씩 입력받는다. (-> 크기가 n이므로 벡터 사용)
    3. S의 최솟값을 찾는다.
    4. S의 최솟값을 출력한다.
*/
int main() {
    //1
    int n;
    cin >> n;

    //2  
    vector<int> avec(n);
    vector<int> bvec(n);
    int sum = 0;

    //A원소들 입력받기
    for (int i = 0; i < n; i++) {
        cin >> avec[i];
    }

    //B원소들 입력받기
    for (int i = 0; i < n; i++) {
        cin >> bvec[i];
    }

    //3    
    //a벡터는 내림차순으로 정렬
    sort(avec.rbegin(), avec.rend());
    //b벡터는 올림차순으로 정렬
    sort(bvec.begin(), bvec.end());
   
    //4
    for (int i = 0; i < n; i++) {
        sum+=avec[i] * bvec[i];
    }
    cout << sum << endl;
    
    return 0; 
}