반응형
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
반응형
그리드형
'문제풀이(Problem Solving)' 카테고리의 다른 글
백준, BOJ, 5568번, 카드 놓기 : C++ [CPP] (0) | 2022.01.07 |
---|---|
백준, BOJ, 2243번, 사탕상자 : C++ [CPP] (0) | 2022.01.06 |
백준, BOJ, 1665번, 가운데를 말해요 : C++ [CPP] (0) | 2022.01.05 |
백준, BOJ, 1062번, 가르침 : C++ [CPP] (0) | 2022.01.04 |
백준, BOJ, 2842번, 집배원 한상덕 : C++ [CPP] (0) | 2022.01.04 |