문제풀이(Problem Solving)

백준, BOJ, 1713번, 후보 추천하기 : C++ [CPP]

게임이 더 좋아 2022. 1. 6. 00:28
반응형
728x170

어렵지 않았다.

그냥 시키는대로만 했다.

 

다만... tuple을 사용할 때는.. 직접 접근이 아니면 값복사라는 사실을 간과하고 짰다..

30분 날렸다.

 

 

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

 


 

#맞은 풀이

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

using namespace std;

vector<tuple<int, int, int>> frame;

int N;
int student;

bool cmp(tuple<int,int,int>& t1, tuple<int,int,int>& t2) {
    if (get<2>(t1) == get<2>(t2)) {
        if (get<1>(t1) == get<1>(t2))
            return get<0>(t1) > get<0>(t2);
        else 
            return get<1>(t1) < get<1>(t2);
    }
    return get<2>(t1) < get<2>(t2);
    
}

int main() {
    cin >> N >> student;
    int emptyF = N;
    for (int i = 1; i <= student; i++) {

        int number;
        cin >> number;

        bool isOn = false;
        //액자에 걸려있는지 확인
        auto iter = frame.begin();
        for (iter; iter != frame.end(); iter++) {
            //걸려있으면
            if (get<2>(*iter) == number) {
                //get<0>(st) += 1; -> 이렇게 하면 값복사임..  -> 30분 날림
                auto x = make_tuple(get<0>(*iter) + 1, get<1>(*iter), get<2>(*iter));
                *iter = x;
                isOn = true;
                break;
            }
        }
        
        //걸려있으면 추천 수 올리고 끝
        if (isOn)continue;

        //걸려있지 않으면 빈액자 확인
        if (emptyF > 0) {
            emptyF--;
            frame.push_back(make_tuple(1, i, number));
        }
        //빈액자 없으면
        else {
            //기본적으로 오름차순으로 정렬
            sort(frame.begin(), frame.end()); //(추천낮은순, 일찍 액자속에 들어간 순(오래된 순))
            frame.erase(frame.begin());
            frame.push_back(make_tuple(1, i, number));
        }
    }

    //다 끝난 후 학생들 번호순으로 sorting해야함.
    sort(frame.begin(), frame.end(), cmp);
    for (auto x : frame) {
        int n = get<2>(x);
        cout << n << ' ';
    }


    return 0;
}

 

 

30분 날린게 값복사 때문이라니..ㅠ

pair나 tuple로 래핑된 애들은.. 새로 만들어서 넣어줘야한다.

원소 접근으로는 값복사만 된다..

make_tuple, make_pair를 잘 사용해보자

 

728x90
반응형
그리드형