본문 바로가기
알고리즘!/Bruteforce

[C] 14500: 테트로미노

by soeayun 2023. 8. 1.

이 문제는 효율적이게 풀 수 있는지는 모르겠지만 그냥 bruteforce로 풀었다. 

 

하늘색 막대기는 2가지 경우의 수

노란색 막대기는 1가지 경우의 수 

초록색 막대기와 분홍색 막대기는 4가지 경우의 수

주황색 막대기는 8가지 경우의 수가 있고 각각의 경우의 수 중에 최대 값을 구하면 됐다.

 

그리고 구역을 나누어서 최대한 for문의 개수가 적게 만들도록 노력했다.

사실 코드가 너무 길고 구현이 단순해서 쉽게 안풀릴 줄 알았는데

다행히 잘  풀렸다!

앞으로도 일단 그냥 코드를 짜보는 연습을 더 해야겠다

 

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

 int arr[501][501]; 
int blue(int x_max,int y_max)
{
  int max=0;
  int tmp;
  for(int j=1;j<=y_max;j++)  //가로로 길게
    {
      for(int i=1;i<=x_max-3;i++)
        {
          tmp=arr[j][i]+arr[j][i+1]+arr[j][i+2]+arr[j][i+3];
          if(tmp>max)
            max=tmp;
        }
    }
  for(int i=1;i<=x_max;i++)  //세로로 길게
    {
      for(int j=1;j<=y_max-3;j++)
        {
          tmp=arr[j][i]+arr[j+1][i]+arr[j+2][i]+arr[j+3][i];
          if(tmp>max)
            max=tmp;
        }
    }
  return max;
}

int yellow(int x_max,int y_max)
{
  int max=0;
  int tmp;
  for(int j=1;j<=y_max-1;j++)
    {
      for(int i=1;i<=x_max-1;i++)
        {
          tmp=arr[j][i]+arr[j][i+1]+arr[j+1][i]+arr[j+1][i+1];
          if(tmp>max)
            max=tmp;
        }
    }
  return max;
}

int orange(int x_max,int y_max)
{
  int max=0;
  int tmp1,tmp2,tmp3,tmp4;
  for(int j=1;j<=y_max-2;j++) //똑바로 있을 때
    {
      for(int i=1;i<=x_max-1;i++)
        {
          tmp1=arr[j][i]+arr[j+1][i]+arr[j+2][i]+arr[j+2][i+1];
          tmp2=arr[j][i+1]+arr[j+1][i+1]+arr[j+2][i]+arr[j+2][i+1]; //y축대칭
          tmp3=arr[j][i]+arr[j][i+1]+arr[j+1][i]+arr[j+2][i]; //x축대칭
          tmp4=arr[j][i]+arr[j][i+1]+arr[j+1][i+1]+arr[j+2][i+1]; //원점대칭
          tmp1=tmp1>tmp2?tmp1:tmp2;
          tmp3=tmp3>tmp4?tmp3:tmp4;
          tmp1=tmp1>tmp3?tmp1:tmp3;
          if(tmp1>max)
            max=tmp1;
        }
    }

  for(int j=1;j<=y_max-1;j++) //옆으로 있을 때
    {
      for(int i=1;i<=x_max-2;i++)
        {
          tmp1=arr[j][i]+arr[j][i+1]+arr[j][i+2]+arr[j+1][i];
          tmp2=arr[j][i]+arr[j][i+1]+arr[j][i+2]+arr[j+1][i+2]; //y축대칭
          tmp3=arr[j][i]+arr[j+1][i]+arr[j+1][i+1]+arr[j+1][i+2]; //x축대칭
          tmp4=arr[j][i+2]+arr[j+1][i]+arr[j+1][i+1]+arr[j+1][i+2];//원점대칭
          tmp1=tmp1>tmp2?tmp1:tmp2;
          tmp3=tmp3>tmp4?tmp3:tmp4;
          tmp1=tmp1>tmp3?tmp1:tmp3;
          if(tmp1>max)
            max=tmp1;
        }
    }

  return max;
}

int green(int x_max,int y_max)
{
  int max=0;
  int tmp1,tmp2;
  for(int j=1;j<=y_max-1;j++) //옆으로 돌아있을때
    {      
      for(int i=1;i<=x_max-2;i++)
        {
          tmp1=arr[j][i]+arr[j][i+1]+arr[j+1][i+1]+arr[j+1][i+2];
          tmp2=arr[j+1][i]+arr[j][i+1]+arr[j+1][i+1]+arr[j][i+2];
          if(tmp2>max)
            max=tmp2;
          if(tmp1>max)
            max=tmp1;
        }
    }
  for(int j=1;j<=y_max-2;j++) //위로 있을때(3X2)
    {      
      for(int i=1;i<=x_max-1;i++)
        {
          tmp1=arr[j][i]+arr[j+1][i]+arr[j+1][i+1]+arr[j+2][i+1];
          tmp2=arr[j][i+1]+arr[j+1][i]+arr[j+1][i+1]+arr[j+2][i];
          if(tmp2>max)
            max=tmp2;
          if(tmp1>max)
            max=tmp1;
        }
    }
  return max;
}

int pink(int x_max,int y_max)
{
  int max=0;
  int tmp1,tmp2;
  for(int j=1;j<=y_max-2;j++) //옆으로 돌아있을 때
    {
      for(int i=1;i<=x_max-1;i++)
        {
          tmp1=arr[j][i]+arr[j+1][i]+arr[j+1][i+1]+arr[j+2][i];
          tmp2=arr[j][i+1]+arr[j+1][i]+arr[j+1][i+1]+arr[j+2][i+1];
          if(tmp2>max)
            max=tmp2;
          if(tmp1>max)
            max=tmp1;
        }
    }
  
  for(int j=1;j<=y_max-1;j++) //앞으로 있을 때
    {
      for(int i=1;i<=x_max-2;i++)
        {
          tmp1=arr[j][i]+arr[j][i+1]+arr[j+1][i+1]+arr[j][i+2];
          tmp2=arr[j+1][i]+arr[j][i+1]+arr[j+1][i+1]+arr[j+1][i+2];
          if(tmp2>max)
            max=tmp2;
          if(tmp1>max)
            max=tmp1;
        }
    }
  return max;
  
}

  int main(void)
  {
    int x,y;
    scanf("%d %d",&y,&x);
    for(int j=1;j<=y;j++)
      {
        for(int i=1;i<=x;i++)
          {
            scanf("%d",&arr[j][i]);
          }
      }
    int max[6];
    max[1]=blue(x,y);
    max[2]=yellow(x,y);
    max[3]=orange(x,y);
    max[4]=green(x,y);
    max[5]=pink(x,y);

    int real_max=0;
    for(int i=1;i<=5;i++)
      {
        real_max=max[i]>real_max?max[i]:real_max;
      }

    printf("%d",real_max);
    
  }

 

'알고리즘! > Bruteforce' 카테고리의 다른 글

[C] 1004: 어린 왕자  (0) 2023.08.08
[C] 9663: N-Queen  (0) 2023.08.06