본문 바로가기
C++/Baekjoon

[BOJ] 2022 SISS 1학기 스터디 - 5주차

by 단월໒꒱ 2022. 5. 20.

#2751 : 수 정렬하기 2 (Class 2 Silver 5)

[문제]

 

 

 

[코드 및 결과]

 

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    int N, num;
    vector<int> v;
    
    cin >> N;
    
    for (int i = 0; i < N; i++) {
        cin >> num;
        v.push_back(num);
    }
    
    sort(v.begin(), v.end());
    
    vector<int>::iterator i;
    for (i = v.begin(); i != v.end(); i++) {
        cout << *i << "\n";
    }
    
    return 0;
}

 

 

 

 

 

 

[설명]

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 문제이다. 간단하지만 시간제한이 있어서 for문으로 정렬할 경우 시간초과가 뜨기 때문에 정렬 알고리즘을 사용해야 한다.

알고리즘을 include 해주고 sort 함수를 사용하기로 했다.

먼저 입력받을 수의 개수 N을 입력받고 입력받은 N만큼 수를 입력받는다.

이때, 수를 입력받아 벡터 v에 차곡차곡 저장해준다.

그 후에 sort 함수로 v의 처음부터 끝까지 오름차순으로 정렬해준다.

정렬이 끝난후, 반복자 iterator를 이용하여 벡터의 요소들을 참조하여 벡터에 저장된 값들을 차례대로 출력해준다.

 

 

 

#11651 : 좌표 정렬하기 2 (Class 2 Silver 5)

[문제]

 

 

 

[코드 및 결과]

 

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool cmp(pair<int, int> a, pair<int, int> b) {
    if (a.second == b.second)
        return a.first < b.first;
    else
        return a.second < b.second;
}

int main() {
    int N, x, y;
    vector<pair<int, int>> v;
    
    cin >> N;
    
    for (int i = 0; i < N; i++) {
        cin >> x >> y;
        v.push_back({x, y});
    }
    
    sort(v.begin(), v.end(), cmp);
    
    for (int j = 0; j < N; j++) {
        cout << v[j].first << " " << v[j].second << "\n";
    }
    
    return 0;
}

 

 

 

 

 

 

[설명]

점 좌표 N개를 입력받아, 좌표를 y좌표가 증가하는 순으로 정렬하는 문제이다. 이때, y좌표가 같으면 x자표가 증가하는 순으로 정렬한다.

먼저 좌표의 개수 N을 입력 받는다.

그 이후 N 만큼 반복하여 좌표들을 입력받는데, pair를 이용하여 쌍을 지어 저장해준다.

위에서 입력받은 좌표들을 저장한 벡터 v를 sort를 이용하여 정렬해주는데, 세번째 파라미터로 cmp 함수를 넣어서 pair의 두번째 값까지 비교하도록 해준다.

위의 cmp 함수를 살펴보면, y 좌표값이 같으면 x 좌표값을 비교하고, 그렇지 않으면 y 좌표값을 비교하여 boolean 값을 반환하는 함수이다.

그렇게 하여 y좌표를 우선으로, 그 후에 x좌표대로 정렬을 해준다.

마지막으로 for문으로 정렬된 벡터 v를 인덱스를 기준으로 공백을 두고 첫번째 값과 두번째 값을 출력해준다.

 

 

 

#11399 : ATM (자유 Silver 3)

[문제]

 

 

 

[코드 및 결과]

 

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    int N, time, sum = 0;
    vector<int> t;
    
    cin >> N;
    
    for (int i = 0; i < N; i++) {
        cin >> time;
        t.push_back(time);
    }
    
    sort(t.begin(), t.end());

    for (int i = 0; i < N; i++) {
        for (int j = 0; j <= i; j++) {
            sum += t[j];
        }
    }
    
    cout << sum << "\n";
    
    return 0;
}

 

 

 

 

 

 

[설명]

이 문제는 사람의 수와 각 사람이 돈을 인출하는데 걸리는 시간을 입력받은 후, 여기서 모든 사람들이 돈을 인출하는데 필요한 시간의 최솟값을 구하는 문제이다.

문제를 잘 읽어보면, 돈을 인출하는데 필요한 시간을 오름차순으로 정렬한 경우에, 총 시간의 합이 최소가 됨을 알 수 있다.

일단, main 함수 앞부분은 아래에 이중 for문을 사용하기 때문에 시간이 걱정되어 입출력을 빠르게 하기 위해 넣어준 코드이다.

사람의 수 N을 입력받고, N만큼 각 사람이 돈을 인출하는데 걸리는 시간을 입력받아 벡터 t에 넣어준다.

위의 문제들과 마찬가지로 sort 함수로 벡터t에 저장된 값들을 오름차순으로 정렬해준다.

이중 for문을 사용하여 각 사람이 돈을 인출하는데까지 걸리는 시간을 구하고 최종적으로 나온 sum값을 출력해준다.

 

 

 

 

댓글