Post List

[BOJ] 백준 1713 후보 추천하기

문제 링크 : https://www.acmicpc.net/problem/1713


문제 조건에 나와있는 그대로 코딩하면 되는 문제 입니다.
인스타그램이나 페이스북을 생각하면서 코딩하면 더 재밌는 문제 입니다.
마치 SNS 개발자가 된 느낌 입니다.




소스 코드 :

#include 
#include 
#include 
using namespace std;

class Candidate {
public:
 int name; // 이름
 int like; // 좋아요 수
 int idx; // 게시되었을때의 인덱스 정보
 Candidate(int, int, int);
};

Candidate::Candidate(int n = 0, int l = 0, int i = 0) : name(n), like(l), idx(i) {};

int main() {
 int frame; cin >> frame; cin.ignore();
 int num; cin >> num; cin.ignore();
 vector v;
 for (int i = 0; i < num; i++) {
  int c; cin >> c; cin.ignore();
  bool flag = false;
  int saveIdx = 0;
  // 현재 추천받은 사람이 사진틀 안에 있는지 탐지.
  for (int q = 0; q < v.size(); q++) {
   // 사진틀 안에 있다면
   if (c == v[q].name) {
    flag = true;
    saveIdx = q;
    break;
   }
  }
  // 겹치는 사람이 있다면, 사진틀 속 그 사람의 좋아요수 올림.
  if (flag) {
   v[saveIdx].like++;
  }
  // 겹치는 사람이 없을 경우 ( saveIdx = 0 인 상태 )
  else {
   // 아직 액자 개수가 충분할 때
   if (v.size() < frame) {
    v.push_back(Candidate(c, 1, i));
   }
   // 액자 개수가 부족해서 규칙에 따라 한명 없애야 할 때
   else {
    int idx = 1001;
    int low = 1001;
    for (int m = 0; m < v.size(); m++) {
     if (low > v[m].like) {
      low = v[m].like;
      idx = v[m].idx;
      saveIdx = m;
     }
     else if (low == v[m].like) {
      if (idx > v[m].idx) {
       idx = v[m].idx;
       saveIdx = m;
      }
     }
    }
    Candidate tmp(c, 1, i);
    v[saveIdx] = tmp;
   }
  }
 }// for문 종료( i )

 // 오름차순 정렬
 vector order;
 for (int i = 0; i < frame; i++) order.push_back(v[i].name);
 sort(order.begin(), order.end());
 for (int i = 0; i < frame; i++) cout << order[i] << ' ';
 cout << endl;
 

}

댓글