되는대로 살자

[C언어 기출문제&풀이] 동맹휴업(Hartal) 본문

2009~2014/C/C++

[C언어 기출문제&풀이] 동맹휴업(Hartal)

malu 2011. 5. 15. 21:31

방글라데시의 정당들은 자신의 세를 과시하기 위해 정기적인 동맹휴업(파업)을 추진하는데, 이 동맹 휴업은 경제에 상당한 피해를 끼칠 수 있다. 이 문제에서는 각 당을 동맹 휴업 지수(hartal parameter)라고 부르는h라는 양의 정수로 나타낼 수 있다고 하자. 이 동맹 휴업지수는 한 동맹 휴업과 다음 동맹 휴업 사이의 기간을 날짜 수로 표시한 값이다.

세 개의 정당이 있다고 생각해보자. 그리고 i번째 당의 동맹휴업지수를 hi라고 할때 h1=3, h2=4, h3=8이라고 가정하자 N일(N=14)일 동안의 세 당의 행보를 시뮬레이션 하면 다음과 같이 표시할 수 있다. 시뮬레이션은 항상 일요일에 시작하며 금요일이나 토요일에는 동맹 휴업이 없다.
요일           1 2 3 4 5 6 7 8 9 10 11 12 13 14
1번 정당           x     x      x          x
2번 정당             x         x            x
3번 정당                        x
동맹휴업          1 2         3  4         5

이 결과를 보면 14일 동안 정확하게 다섯번의 동맹휴업(3,4,8,9,12일)이 있음을 알 수 있다. 6일은 금요일이기 때문에 동맹 휴업이 일어낮 ㅣ않는다. 결국 2주 동안 근무 일수로 5일의 동맹 휴업이 실시된다.

몇 정당의 동맹 휴업 지수와, 어떤 정수 N이 주어졌을 때, N일 가운데 동맹 휴업으로 인해 일을 하지 않은 근무 일수를 계산하라.

입력: 입력의 첫번째 줄에는 입력될 테스트 케이스의 개수를 나타내는 하나의 ㅈ어수 T가 들어있다. 각 테스트 케이스의 첫번째 줄에는 한 개의 정수 N(7<=N<=3650)이 들어 있으며 시뮬레이션을 돌릴 기간(날 수)을 나타낸다. 그 다음 줄에는 정당의 개수를 나타내는 정수 P(1<=P<=100)가 들어간다 그 다음부터 시작하는 P 개의 줄 가운데 i번째 줄(1<=i<=P)에는 i번째 정당의 동맹 휴업 지수를 나타내는 양의 정수 hi(7의 배수는 아님)가 들어있다. 

출력: 각 테스트 케이스에 대해 손실된 근무 일수를 한 줄에 하나씩 출력한다.

풀이: 입력 조건 대로 입력을 받은 다음, 1~N까지 날수를 증가하면서 처음으로 이 날짜가 금,토요일이 아닌지(j-1%7<5)로 검사하고, 동맹휴업일인지를 검사(j%h[k]==0)하여 총 동맹휴업일수를 출력한다. 

소스코드 :
#include <stdio.h>

void main(void)
{
 int t,n,p,h[100],chk_lost,lost,i,j,k;
 scanf("%d",&t); // 케이스 갯수
 while(t-->0)
 {
  //입력
  lost=0;
  scanf("%d",&n); //날 수
  scanf("%d",&p); // 정당의 개수
  for(i=0;i<p;i++)
   scanf("%d",&h[i]); //i번째 정당의 동맹휴업 지수
  lost=0;
  for(j=1;j<=n;j++) //날수를 증가시키며
   if((j-1) % 7 < 5) // 금,토 제외
    for(k=0;k<p;k++) 
     if(j%h[k]==0) //오늘이 동맹휴업일인가?
     {
      lost++; // 휴업일+1
      break;
     }
  printf("%d\n",lost);
 }
}