하루하루 꾸준히, 인생은 되는대로

자료구조

백준 4158 CD cpp

긤효중 2022. 3. 31. 20:23

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

 

4158번: CD

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 상근이가 가지고 있는 CD의 수 N, 선영이가 가지고 있는 CD의 수 M이 주어진다. N과 M은 최대 백만이다. 다음 줄

www.acmicpc.net


문제

상근이와 선영이는 동시에 가지고 있는 CD를 팔려고 한다. CD를 몇 개나 팔 수 있을까?


입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 상근이가 가지고 있는 CD의 수 N, 선영이가 가지고 있는 CD의 수 M이 주어진다. N과 M은 최대 백만이다. 다음 줄부터 N개 줄에는 상근이가 가지고 있는 CD의 번호가 오름차순으로 주어진다. 다음 M개 줄에는 선영이가 가지고 있는 CD의 번호가 오름차순으로 주어진다. CD의 번호는 십억을 넘지 않는 양의 정수이다. 입력의 마지막 줄에는 0 0이 주어진다.

상근이와 선영이가 같은 CD를 여러장 가지고 있는 경우는 없다.


출력

두 사람이 동시에 가지고 있는 CD의 개수를 출력한다.


해결방안 -> 상근이가 소유한 CD가 큰 경우, 선영의 CD개수가 크거나 같은 경우로 처음에 나눠주었다.

만약 상근이가 소유한 CD 개수가 큰 상태라면, 상근이의 CD개수를 map에 넣어두고, 선영이가 소유한 CD를 입력받고, map에 있는지 탐색한다.

map에 선영이가 소유한 CD가 있다면 상근이와 선영이가 모두 CD를 가진 경우이므로 count변수를 1 증가시킨다.

그와 반대인 경우에는 map에 선영이의 CD를 모두 맵에 넣어두고, 상근이가 보유한 CD를 입력받고, map에서 찾는다.

마찬가지로 map에 CD가 있으면 두 사람이  모두 CD를 소유한 경우이므로 count++증가시킨다.

테스트케이스가 여러개여서 마지막에 map.clear()를 해준다.


전체 소스코드->

#include <iostream>
#include <unordered_map>
 
//백준 4158 CD

 

using namespace std;
 
int main(void){
   
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    while(1){
    bool big_cd = false;
    int n,l;
    cin >> n >> l;
    if(n == 0 && l == 0){
        break;
    }
    if(n > l){ //상근이의 CD 개수가 큰 경우
        big_cd = true;
    }
    else{ //선영의 CD개수가 크거나 같은경우
        big_cd = false;
    }
    unordered_map<int,int> m;
    unordered_map<int,int>::iterator iter;
    int count = 0;
 
    if(big_cd == true){
        for(int i = 0;i<n;i++){
        int input;
        cin >> input;
        m.insert(pair<int,int>(input,input));
        }
 
        for(int i = 0;i<l;i++){
            int check;
            cin >> check;
            iter = m.find(check);
            if(iter != m.end()){
                count++;
            }
 
        }
    }
 
    else if(big_cd == false){
        for(int i = 0;i<l;i++){
            int input;
            cin >> input;
            m.insert(pair<int,int>(input,input));
        }
        for(int i = 0;i<n;i++){
            int check;
            cin >> check;
            iter = m.find(check);
            if(iter != m.end()){
                count++;
            }
        }
    }
 
        cout << count << '\n';

 

    }
 
 
}

'자료구조' 카테고리의 다른 글

백준 14753 C++  (0) 2022.04.21
백준 8979 올림픽 C++  (0) 2022.04.08
백준 1431 시리얼번호 C++  (0) 2022.03.27
C++ Priority queue 컨테이너 사용법  (0) 2022.03.25
STD::multimap  (0) 2022.03.19