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

C언어 134제] 와우패스 JOB 삼성소프트웨어 역량테스트 매트릭스 응용

by 건티 2022. 5. 13.
728x90

출처 : 반크_세계유산 석굴암

 

문제]

P86 참조

 

입력)

첫째 줄은 테스트케이스 N을 입력한다( 0 < N <=3)

둘째 줄은 지도의 크기를 입력한다.(4<=T<=50)

셋째 줄은 쉼표를 기준으로 A,B,C형 폭탄의 떨어진 좌표를 입력한다.

 

출력)

#테스트케이스 1~N번을 출력하고 한칸 띄어 그에 해당하는 영향을 받지 않는 칸의 개수를 출력한다.

 

입력 예)

3

7

0 0 1 5 3 5 5 6,1 1 2 4 5 2,3 2 5 5

4

0 1 1 3,2 2,2 3 3 3

5

0 0 3 4 2 4,1 2 4 2,3 2 4 4

 

출력 예)

#1 10

#2 1

#3 4

 

 

참고풀이]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int get(int i, int j, int num)//범위(range) 체크 함수
{
   if(i<0 || j<0 || i>=num || j>=num)
      return 0;
   return 1;


int matrix(char **board, int num) //A, B, C형 폭탄의 범위 계산
{
   int i,j;//반복변수, 인덱스 변수
   int remainder;//남은 지역 수 변수

   for(i=0; i<num; i++)
      for(j=0; j<num; j++)
         switch(board[i][j])
         {
            case 'C': //C형 폭탄 3칸의 범위 체크
               if(get(i-3,j,num)==1 && board[i-3][j]=='0') board[i-3][j]='1';
               if(get(i,j-3,num)==1 && board[i][j-3]=='0') board[i][j-3]='1';
               if(get(i+3,j,num)==1 && board[i+3][j]=='0') board[i+3][j]='1';
               if(get(i,j+3,num)==1 && board[i][j+3]=='0') board[i][j+3]='1';
            case 'B': //B형 폭탄 2칸의 범위 체크
               if(get(i-2,j,num)==1 && board[i-2][j]=='0') board[i-2][j]='1';
               if(get(i,j-2,num)==1 && board[i][j-2]=='0') board[i][j-2]='1';
               if(get(i+2,j,num)==1 && board[i+2][j]=='0') board[i+2][j]='1';
               if(get(i,j+2,num)==1 && board[i][j+2]=='0') board[i][j+2]='1';
           case 'A': //A형 폭탄 1칸의 범위 체크
               if(get(i-1,j,num)==1 && board[i-1][j]=='0') board[i-1][j]='1';
               if(get(i,j-1,num)==1 && board[i][j-1]=='0') board[i][j-1]='1';
               if(get(i+1,j,num)==1 && board[i+1][j]=='0') board[i+1][j]='1';
               if(get(i,j+1,num)==1 && board[i][j+1]=='0') board[i][j+1]='1';
         }

   //폭탄위치에서 영향을 받지 않는 위치 카운트
   remainder=0;
   for(i=0;i<num;i++)
      for(j=0;j<num;j++)
         if(board[i][j]=='0') remainder++;

   return remainder; //폭탄의 영향 받지 않은 지역 수 반환 



int main()
{
   FILE *fin, *fout;
   fin=fopen("input.txt","r");
   fout=fopen("ontput.txt","w");

   char tempNum[50], temp[100];//파일 입출력
   char **arrNum; //2차원 배열
   char *cutStr[3]; //폭탄 위치 좌표 변수 
   int num, size[3]; //지도크기와  A,B,C형 폭탄의 좌표 문자열의 길이수
   int pt[3][8]={0,}, ptx, pty; //좌표변수
   int i,j,k;//반복변수
   int remainder, testNum;//남은 지역수, 테스트케이스 변수
 
   while(1) //테스트케이스의 범위를 체크한다 
   {
      fgets(temp, 100, fin);
      testNum=atoi(temp);
      if(testNum>0 && testNum<=3) break;
      exit(-1);//작업종료하기 
   }

   for(k=0; k<testNum; k++)
   {
      while(1) //지도크기의 수의 범위를 체크한다. 
      {
         fgets(tempNum, 50,fin);
         num=atoi(tempNum);
         if(num>=4 && nem<=50) break;
         exit(-1);
      }
      while(1) //입력된 좌표가 ,(2개)로 구분되었는지 체크한다. 
      {
         fgets(temp,100,fin);
         j=0;
         for(i=0;i<strlen(temp);i++)
            if(temp[i]==',') j++;
         if(j==2) break;
         exit(-1);
   }

   //지도 크기 할당 
   arrNum=(char **)malloc(sizeof(char *)*num);//배열크기 할당
   for(i=0;i<num;i++)
      arrNum[i]=(char *)malloc(sizeof(char)*num);

   //선언된 배열에 초기값 설정
   for(i=0;i<num;i++) 
      for(j=0;j<num;j++)
        arrNum[i][j]='0';

   //각형의 좌표를 각형의 문자열에 저장 
   cutStr[0]=strtok(temp,",");//A형
   cutStr[1]=strtok(NULL,",");//B형
   cutStr[2]=strtok(NULL,",");//C형 

   //각형 좌표 문자열의 길이를 저장 
   for(i=0;i<3;i++)
      size[i]=strlen(cutStr[i]);

   //좌표를 숫자로 변환하여 저장하기 
   for(i=0;i<3;i++)
   {
      pt[i][0]=atoi(strtok(cutStr[i]," "));
      for(j=1;j<=(size[i]-1)/2;j++)
         pt[i][j]=atoi(strtok(NULL," "));
   }

   //지정된 좌표에 폭탄을 위치한다. 
   for(i=0;i<3;i++)
   {
      for(j=0;j<=(size[i]-1)/2;j++)
      {
        if(i==0)
        {
            if((i+j)%2==0)
               ptx=pt[i][j];
            else
            {
               pty=pt[i][j];
               arrNum[ptx][pty]='A';
            }
        }
        else if(i==1)
        {
             if((i+j)%2==0)
             {
                pty=pt[i][j];
                arrNum[ptx][pty]='B';
             }
             else
                ptx=pt[i][j];
        }
        else
        {
           if((i+j)%2==0)
              ptx=pt[i][j];
           else
           {
              pty=pt[i][j];
              arrNum[ptx][pty]='C';
           } 
        }
       }
      }

      remainder=matrix(arrNum,num);//함수 호출 후 남은 지역 수 반환받는다.

      //결과 파일로 출력 
      fprintf(fout, "#%d %d\n",k+1,remainder);
   }
                  
   fclose(fout);
   fclose(fin);

   return 0;

}

 

 

참고풀이 결과]

 

입력파일] input.txt

input.txt
0.00MB

 

 

 

 

 

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

 

 

 

 

반응형

댓글