본문 바로가기
알고리즘/BOJ

[BOJ] 3052. 나머지 (vector 중복 제거)

by hyerann 2019. 7. 3.

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

 

3052번: 나머지

문제 두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.  수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오. 입력 첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다. 출력 첫째 줄에, 42로 나누었

www.acmicpc.net

나머지를 vector에 삽입하고 sort(), unique()와  erase()를 이용하여 중복 제거를 한 후 vector의 사이즈를 출력하였다.

unique()는 앞에서부터 unique한 원소들을 채우고, 나머지 원소들은 뒤로 보낸 후 unique한 원소 다음의 포인터를 리턴한다.

주의할 점은 해당 vector가 정렬된 상태여야한다는 점이다.

예를 들어 vector에 1, 1, 2, 3, 3, 3, 4, 4, 5, 5, 5가 들어있으면

unique()를 수행한 후 1, 2, 3, 4, 5, 1, 3, 3, 4, 5, 5가 되며, 6번째 원소의 포인터를 리턴한다.

그럼 6번째 원소의 포인터부터 vector의 마지막 원소 포인터까지 erase()하면 중복이 제거된 결과 1, 2, 3, 4만 남게 된다.

#include <iostream>
#include <ios>
#include <vector>
#include <algorithm>
#define ARRAY_SIZE 10
using namespace std;

int numbers[ARRAY_SIZE];
vector<int> remainders;

int main() {
    cin.tie(0);
    ios::sync_with_stdio();
    
    for(int i=0; i<ARRAY_SIZE; i++) {
        cin >> numbers[i];
        remainders.push_back(numbers[i]%42);
    }
    
    sort(remainders.begin(), remainders.end());
    remainders.erase(unique(remainders.begin(),remainders.end()),remainders.end());
    // unique는 중복 제거를 하고, 마지막 원소의 iterator값 리턴
    // 앞에서부터 unique한 원소들로 채우고, 나머지는 뒤에 몰아넣고 뒤에 몰아 넣은 첫 원소의 포인터 리턴

    cout << remainders.size();
    
    return 0;
}

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ] 1181. 단어 정렬  (0) 2020.03.25
[BOJ] 11866. 요세푸스 문제 0  (0) 2020.03.25
[BOJ] 10989. 수 정렬하기 3 (Counting Sort)  (0) 2019.04.28
[BOJ] 2750. 수 정렬하기 (Bubble Sort)  (0) 2019.04.27
[BOJ] 1934. 최소공배수  (0) 2019.04.23

댓글