이 문제는 효율적이게 풀 수 있는지는 모르겠지만 그냥 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 |