Algorithm/BOJ

[BOJ] #25757 임스와 함께하는 미니게임

jHoon0223 2024. 2. 20. 11:29

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

 

25757번: 임스와 함께하는 미니게임

첫 번째 줄에는 사람들이 임스와 같이 플레이하기를 신청한 횟수 $N$과 같이 플레이할 게임의 종류가 주어진다. $(1 \le N \le 100\,000)$ 두 번째 줄부터 $N$개의 줄에는 같이 플레이하고자 하는 사람들

www.acmicpc.net


실버5 난이도라 매우 쉽다. 중복제거 매커니즘만 알고있으면 5분만에 풀수 있을 정도다.

입력받은 사람들의 명단에서 중복되는 값들을 제거 한 후, 중복 없는 자료구조의 크기만큼 케이스에 따라 1이나 2나 3으로 나눠주면 된다. 다만 여기서, "임스는 한 번 같이 플레이한 사람과는 다시 플레이하지 않습니다." 라는 조건이 있기 때문에, 한번 플레이한 사람은 다시 선택될 수 없으므로, 그냥 정수로 나누고 나머지를 버린값을 취해주면 된다.

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

using namespace std;

int main() {
    char c;
    int N;
    cin >> N >> c;

    vector<string> v;
    for (int i=0; i<N; i++) {
        string s;        

        cin >> s;
        v.push_back(s);
    }
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(),v.end()), v.end());

    int num = v.size();

    int total;
    if (c == 'Y') {
        total = num/1;
    }
    else if (c == 'F') {
        total = num/2;
    }
    else if (c == 'O') {
        total = num/3;
    }
    cout << total << endl;

    return 0;
}


필자는 string타입의 vector로 입력받아서 중복되는 값을 제거하는 형태로 풀었는데, 이 'vector에서 중복되는 값 제거하기' 를 수행하려면 다음과 같이 하면 된다.

sort(v.begin(), v.end());
v.erase(unique(v.begin(),v.end()), v.end());

먼저 아무렇게 저장된 vector를 sort함수로 정렬해준다. (#include <algorithm> 필수) 이후 unique와 erase를 이용하여 중복된 값을 제거한다.

unique : 중복된 원소를 vector의 제일 뒷부분으로 보내버림 (쓰레기값 처리) unique 함수의 reture값은 vector 내부 쓰레기값의 첫번째 위치.
erase : 지정해둔 범위 내의 vector 인덱스 모두 삭제. vector size도 줄어듦.

이렇게 unique 함수로 중복된 값을 찾아 맨 뒤로 보내버린뒤에, return된 포인트 값을 erase함수 첫번째 인자로 넣어주면 중복된 값들이 모두 사라지게 된다. 

728x90

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] #12851 숨바꼭질 2  (0) 2024.02.21
[BOJ] #13549 숨바꼭질 3  (0) 2024.02.20
[BOJ] #5014 스타트링크  (0) 2024.02.16
[BOJ] #8979 올림픽  (0) 2024.02.16
[BOJ] #4963 섬의 개수  (0) 2024.02.15