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

C언어 8제] 2020년도 한국정보올림피아드 1차 대회 초등부 2교시 문제2. 피자 오븐

by 건티 2021. 9. 17.
728x90

출처 : 반크 독도포스터

 

문제]

피자를 구워주는 전자식 오븐이 있다. 이 오븐에 재료를 넣어 정확히 N분 동안 동작을 시키고자 한다. 그런데 이 오븐에 준비된 버튼(button)은 아래 그림과 같은 동작을 하는 5가지이다. , 각각의 버튼은 동작 시간을 추가시키거나 감소시킨다. 버튼들의 기능을 하나하나 설명하면, 60분을 증가시키는 ADDH버튼, 10분을 증가시키는 ADDT버튼, 10분을 감소시키는 MINT버튼, 1분을 증가시키는 ADDO버튼, 1분을 감소시키는 MINO버튼이 있다. 시간을 감소시키는 버튼을 눌러서 시간이 0분보다 작아지는 경우는 0분으로 세팅된다. 처음에 피자 오븐의 첫 시간은 0분으로 정해져 있다. t가 현재 오븐에 세팅된 시간, t’은 버튼을 누른 뒤의 시간을 의미하는데 유의하라.

만일 58분을 setting하고 싶으면 ADDO(+1) 버튼을 58번 눌러도 되지만 이건 너무 힘든 일이다. 이 경우에는 ADDH(+60) 버튼을 한번 누른 뒤에 MINO(-1) 버튼을 2번 누르면 3번의 작업으로 58분을 맞출 수 있다. 만일 42분을 맞추고 싶으면 5번의 작업, ADDH, MINT, MINT, ADDO, ADDO (60 10 10 + 1 + 1) 순서로 버튼을 눌러 세팅할 수 있다. 다른 방법으로 ADDT, ADDT, ADDT, ADDT, ADDO, ADDO (10 + 10 + 10 + 10 + 1 + 1) 순서로 6번의 작업으로도 가능하다. 물론 우리는 조금이라도 작은 수의 버튼 누르기 작업 횟수로 이 일을 하고자 한다.

 

세팅해야 할 시간이 주어졌을 때 가장 작은 횟수로 그 시간을 세팅할 버튼의 누르는 횟수와 방법을 구하는 프로그램을 작성하시오.

 

 

입력형식

여러분의 프로그램은 한번의 실행에 여러개의 세팅해야할 시간을 입력으로 받아 모두 처리해야 한다. 하나의 입력 시간을 처리하고 다음 입력을 처리할 때 오븐의 시간은 다시 0분으로 초기화되는 것으로 생각한다. , 각각의 입력은 따로 처리하는 것이다.

 

입력의 첫 줄에 처리해야 하는 경우들의 개수 T가 자연수로 주어진다. (1T100) 다음 T개의 줄에 세팅해야 하는 시간 N이 분 단위의 정수로 주어진다.(1N10,0000,000)

 

출력 형식

여러분은 각 경우마다 5개의 정수를 한 줄에 출력한다. 이 정수들은 차례로 세팅해야 할 시간을 만들기 위해서 ADDH, ADDT, MINT, ADDO, MINO 버튼을 누르는 횟수를 이 순서대로 출력한 것이다. 최소 횟수로 누르는 방법이 두 가지 이상일 경우에는 사전순으로 작은 방법을 출력해야 한다. 여기서 사전순이라 함은 동일한 시간을 세팅하고 작업 횟수가 동일한 방법이 여러 가지가 있을 때, ADDH를 누르는 횟수가 작은 것이 우선이고 ADDH를 누르는 횟수가 동일한 것이 여전히 여러개 있는 경우는 ADDT를 누르는 횟수가 작은 것이 우선이고, 등등으로 선택하여 가장 우선인 것을 선택한다는 말이다.

 

 

예시1]

입력

3

5

12

27

 

출력

0 0 0 5 0

0 1 0 2 0

0 3 0 0 3

 

 

 

참고풀이]

#include <stdio.h>
#include <stdlib.h> //malloc(), free()

int main()
{
   int T;//처리할 작업 수 변수
   int i;//반복변수, 인덱스 변수
   int ADDH;//추가 시간버튼 변수 
   int ADDT;//추가 10분버튼 변수 
   int MINT;//감소 10분버튼 변수 
   int ADDO;//추가 1분버튼 변수 
   int MINO;//감소 1분버튼 변수 

   //작업수를 입력받는다.
   scanf("%d",&T);
   //조건에 맞으면 작업수 만큼 동적메모리 공간을 확보한다. 
   if(T>=1 && T<=100)
   {
      int *N=(int *)malloc(sizeof(int)*T);
      //작업수에 해당하는 실제 작업시간을 입력한다.
      for(i=0;i<T;i++)
      {
         scanf("%d",&N[i]);
         //조건에 해당하는 작업시간이 아니면 작업을 끝낸다. 
         if(N[i]<1 || N[i]>10000000) return 0;
      }

      //각 입력작업시간의 최소 버튼 횟수를 구한다. 
      for(i=0;i<T;i++)
      {
         ADDH=0; ADDT=0; MINT=0; ADDO=0; MINO=0;
         ADDH += N[i]/60;
         N[i]%=60;
         if(N[i]>35)
         {
            ADDH++;
            MINT=6-(N[i]+5)/10;
            N[i]%=10;
            if(N[i]>=5)
               MINO+=10-N[i];
            else
               ADDO+=N[i];
         }
         else
         {
            ADDT=(N[i]+4)/10;
            N[i]%=10;
            if(N[i]>=6)
               MINO+=10-N[i];
            else
               ADDO+=N[i];
         }

         //결과 출력 
         printf("%d %d %d %d %d\n",ADDH,ADDT,MINT,ADDO,MINO);
      }

      //동적메모리 해제
      free(N);
   }

   return 0;
}

 

참고풀이 결과]

 

 

 

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

 

반응형

댓글