이번에 풀어본 문제는 초등부 정올 회장뽑기 문제입니다.
처음엔 문제 내용부터 이해가 잘 안가서 고생했는데, 입력예시랑 결과 보고 다시 문제보니까 이해했습니다.
단순 BFS문제였고 각 회원마다 점수들 저장시켜서 최종적으로 가장 적은 점수 가진사람들 출력하면 끝나는 쉬운 문제였습니다.
회장뽑기
문제3) 월드컵 축구의 응원을 위한 모임에서 회장을 선출하려고 한다. 이 모음은 만들어진지 얼마 되지 않았기 때문에 회원 사이에 서로 모르는 사람도 있지만, 몇 사람을 통하면 모두가 서로 알
codeup.kr
#include <stdio.h>
#include <queue>
#include <algorithm>
using namespace std;
struct info{
int number;
int score;
};
bool cmp(struct info a , struct info b){
if(a.score == b.score) {
return a.number < b.number;
}
return (a.score<b.score);
}
int main()
{
struct info scoreboard[51]={};
int relation[51][51]={};
int n;
scanf("%d",&n);
//-1 -1전까지 받기
int x=0,y=0;
while(x!=-1 && y!=-1){
scanf("%d %d",&x,&y);
//1. 그래프 형태로 표현
relation[x][y] = 1;
relation[y][x] = 1;
//relation[x][y] = relation[y][x] = 1;
}
for(int man=1;man<=n;man++){
int discover[51]={};
queue<pair<int,int> > que;
que.push(make_pair(man,0));
discover[man] = 1;
int score=0;
while(!que.empty()){
pair<int,int> ft = que.front();
que.pop();
if(score < ft.second){
score = ft.second;
}
for(int i=1;i<=n;i++){
if(relation[ft.first][i] == 1 && discover[i] == 0){
que.push(make_pair(i,ft.second+1));
discover[i] = 1;
}
}
}
scoreboard[man]= {man,score};
}
sort(scoreboard+1,scoreboard+n+1,cmp);
int minScore = scoreboard[1].score;
int answerCnt=0;
int i=1;
while(minScore == scoreboard[i].score){
answerCnt++;
i++;
}
printf("%d %d\n",minScore,answerCnt);
for(int j=1;j<=answerCnt;j++){
printf("%d ",scoreboard[j].number);
}
return 0;
}
무편집본 영상
'박기완 코딩교육 > 정보올림피아드 대비' 카테고리의 다른 글
정올 초등 1998 KOI 자동차경주대회. 1차 도전 실패 (0) | 2020.09.11 |
---|---|
정보올림피아드 초등 _ 지역본선 2014. 4번문제 저울 (0) | 2020.09.10 |
코드업 4432 십자카드 초등 정올 (0) | 2020.09.08 |
코드업 4562 숫자의 개수 초등부 정올 (0) | 2020.09.07 |
코드업 4532 곱셈 [ 정보올림피아드 초등] (0) | 2020.09.07 |