안녕하세요!
오늘은 정올 초등 2014년에 지역본선으로 나왔던 4번문제 '저울'을 풀어보았습니다.
저울
문제4) 저울 (초등4, 중등3, 고등2) 무게가 서로 다른 N개의 물건이 있다. 각 물건은 1부터 N 까지 번호가 매겨져 있다. 우리는 일부 물건 쌍에 대해서 양팔 저울로 어떤 것이 무거운 것인지를 측정��
codeup.kr
처음엔 물건 비교결과를 어떤식으로 나열해야할지 감이 안와서 고민해봤는데,
"물건 비교결과를 알수없는 갯수"를 출력해야한다는 문장을 보고선 그래프 형태로 표현하고 탐색할 수 있냐 없냐갖고 따지면 쉽게 풀릴거같단 느낌이 와서 그래프로 표현하게 되었습니다.
위 사진처럼 연결관계그래프라는걸 사용했고
문제 해결 소스와 문제풀이과정 영상 첨부하겠습니다!
정보올림피아드 초등을 대비하고있는 학생들에게 도움되었으면 좋겠네요 ㅎㅎ
#include <stdio.h>
void findTargetCount(int target, int *cnt, int graphs[][101], int n, int visited[])
{
visited[target] = 1;
// printf("findTargetCount(%d,%d)\n",target,*cnt);
for(int i=1;i<=n;i++)
{
if(graphs[target][i] == 1 && visited[i] == 0){
*cnt = *cnt + 1;
findTargetCount(i,cnt,graphs,n, visited);
}
}
}
void findTargetToCount(int target, int *cnt, int graphs[][101], int n, int visited[])
{
visited[target] = 1;
// printf("findTargetToCount(%d,%d)\n",target,*cnt);
for(int i=1;i<=n;i++)
{
if(graphs[i][target] == 1 && visited[i] == 0){
*cnt = *cnt + 1;
findTargetToCount(i,cnt,graphs,n,visited);
}
}
}
int main()
{
int n;
scanf("%d",&n);
int m;
scanf("%d",&m);
int graphs[101][101] ={};
for(int i=1;i<=m;i++){
int x,y;
scanf("%d %d",&x,&y);
//graphs[x][y] = graps[y][x] = 1;
graphs[x][y] = 1;
}
//2. 자신한테 연결된방향 숫자 갯수
// + 자신 +
//자신이 가리키는쪽으로 쭉 갯수 (dfs)
for(int target=1;target<=n;target++){
int cnt=1;
int visited[101] = {};
// printf("target %d \n",target);
//자신한테 연결된방향 숫자 갯수
findTargetCount(target,&cnt, graphs,n, visited);
//자신이 가리키는쪽으로 쭉 갯수
findTargetToCount(target,&cnt, graphs,n, visited);
printf("%d\n",n-cnt);
}
return 0;
}
'박기완 코딩교육 > 정보올림피아드 대비' 카테고리의 다른 글
정올 초등 1998 KOI 자동차경주대회. 1차 도전 실패 (0) | 2020.09.11 |
---|---|
정올 초등_ 회장뽑기 KOI 1997 (0) | 2020.09.09 |
코드업 4432 십자카드 초등 정올 (0) | 2020.09.08 |
코드업 4562 숫자의 개수 초등부 정올 (0) | 2020.09.07 |
코드업 4532 곱셈 [ 정보올림피아드 초등] (0) | 2020.09.07 |