본문 바로가기
프로그램/C언어 1000제

C언어 229제] 2003년 크로아티아 올림피아드 경진대회 고등부 Seniors 1번 금메달, 은메달, 동메달은 누가?

by 건티 2025. 2. 17.
728x90

출처 : 반크_반크 20년 백서

 

문제]

2018년에 대한민국 평창에서 동계올림픽이 개최된다. 그 중에서도 스키는 동계올림픽의 꽃이지만 유독 우리나라에선 인기가 좀 없는 것 같다. 그래서 이번 평창올림픽에선 새로운 스키 경기 규칙이 적용 되었다. 새로 적용된 규칙은 다음과 같다.

스키 경기는 두 번의 경주로 이루어져 있다. 총 N명의 선수가 첫 번째 경주에 참가하고 각각 번호를 부여받는다. 1번 선수부터 N번 선수까지 순서대로 한 명씩 산을 타고 내려간다. 산을 다 내려오면 내려온 선수의 현재 순위가 정해질 것이다. 첫 번째 경주가 끝나고 난 뒤 최종적으로 정해진 순위에 따라서 1등부터 M등까지의 선수들에게만 두 번째 경주에 나갈 수 있는 자격이 주어진다. 

두 번째 경주에서는 첫 번째 경주에서 늦게 들어온 순서대로(M등부터 시작해서 1등까지) 한 명씩 산을 타고 내려간다. 산을 다 내려오면 내려온 선수의 현재 순위가 정해질 것이다. 두 번째 경주가 끝나고 난 뒤 최종적으로 정해진 순위에 따라서 1등, 2등 그리고 3등에게 각각 금메달, 은메달, 동메달이 수여 될 것이다.

이때 메달을 얻은 선수들의 번호를 구하는 프로그램을 작성해야 한다.(경주에 참가한 모든 선수들은 한 명도 빠짐없이 경주를 완주한다. 두 명 이상의 선수가 동시에 들어오는 경우는 없다.)

입력
첫 번째 줄에는 정수 N과 M이 주어진다. (3 ≤ M ≤ N ≤ 100)
이 후 N개의 줄에는 첫 번째 경주에서 각각의 선수들이 내려왔을 때 정해진 현재 순위가 주어진다.
이 후 M개의 줄에는 두 번째 경주에서 각각의 선수들이 내려왔을 때 정해진 현재 순위가 주어진다.

출력
첫 번째 줄에는 금메달을 딴 선수의 번호를, 두 번째 줄에는 은메달을 딴 선수의 번호를, 세 번째 줄에는 동메달을 딴 선수의 번호를 출력한다.

예제 입력 1 
3 3
1
2
3
1
1
1

예제 출력 1 
1
2
3


예제 입력 2 
4 3
1
1
2
2
1
2
1

예제 출력 2 
2
3
4


예제 입력 3 
5 4
1
2
1
4
3
1
1
3
2

예제 출력 3 
5
3
2


출처 : 백준_3230번

 

참고풀이]

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int S[101], R[101];

int main()
{
   int N, M, x;
   int i,j;

   scanf("%d%d", &N, &M);
   if ((M >= 3 && M <= N) && (N >= M && N <= 100))
   {
      for (i = 1;i <= N; i++) // i는 선수 번호
      {

         scanf("%d%*c", &x); //x는 등수
         //입력받은 등수가 현재 입력받은 선수의 수보다 작다면

         if (x < i)
         {
            //기존선수들을 뒤로 한칸씩 이동한다.
            for (j = i;j >= x;j--)
               S[j] = S[j - 1];
            S[x] = i; //그 자리에 입력받은 선수의 번호를 넣는다.
         }
         else
            S[x] = i;
      }

      for (i = 1;i <= M; i++)
      {
         scanf("%d%*c", &x); //x는 등수
         //입력받은 등수가 현재 입력받은 선수의 수보다 작다면
         if (x < i)
         {
            //기존선수들을 뒤로 한칸씩 이동한다.
            for (j = i;j >= x;j--)
               R[j] = R[j - 1];

            //그 자리에 입력받은 선수의 번호를 넣는다.
            R[x] = S[M - i + 1];
         }
         else
            R[x] = S[M - i + 1];
      }

      for (i = 1; i <= 3;i++)//금은동만 출력
         printf("%d\n", R[i]);
   }

   return 0;
}

 

참고풀이 결과]

 

 

 

 

 

 

대한민국의 아름다운 영토, 독도의 봄

 

반응형

댓글