브루트포스문제
수가 워낙 작아서
ㄹㅇ 무식하게 풀 수 있었다.
3085번: 사탕 게임
첫째 줄에 상근이가 먹을 수 있는 사탕의 최대 개수를 출력한다.
www.acmicpc.net
원래는 O(N^2)에 dx dy 넣어서 판별하는거겠지만
dxdy 세그폴트안나게 잘 관리하는거도
걍 귀찮아서
x1 y1 x2 y2 뽑아놓고
둘이 바로 옆에있으면 계산하게끔 짜서
시간복잡도가 O(N^4)다....
#include <stdio.h>
char arr[51][51] = {0};
int n;
int ans=0;
int abs(int a){return a>0?a:a*-1;}
int max(int a, int b){return a>b?a:b;}
void swap(int x1,int y1, int x2, int y2){
int tmp = arr[x1][y1];
arr[x1][y1] = arr[x2][y2];
arr[x2][y2] = tmp;
}
int count(){
int cnt, ret=0;
char pre;
for(int i=0; i<n; i++){
cnt = 1; pre = arr[0][i];
for(int j=1; j<=n; j++){
if(pre == arr[j][i]) cnt++;
else{
pre = arr[j][i];
ret = max(ret,cnt);
cnt = 1;
}
}
}
for(int i=0; i<n; i++){
cnt = 1; pre = arr[i][0];
for(int j=1; j<=n; j++){
if(pre == arr[i][j]) cnt++;
else{
pre = arr[i][j];
ret = max(ret,cnt);
cnt = 1;
}
}
}
return ret;
}
int main(){
scanf("%d", &n);
for(int x1=0; x1<n; x1++){
scanf("%s", &arr[x1]);
}
for(int x1=0; x1<n; x1++) for(int y1=0; y1<n; y1++){
for(int x2=0; x2<n; x2++) for(int y2=0; y2<n; y2++){
if(abs(x1-x2) == 1 && abs(y1-y2) == 0){
swap(x1,y1,x2,y2);
ans = max(ans, count());
swap(x1,y1,x2,y2);
}
if(abs(x1-x2) == 0 && abs(y1-y2) == 1){
swap(x1,y1,x2,y2);
ans = max(ans, count());
swap(x1,y1,x2,y2);
}
}
}
printf("%d", ans);
return 0;
}
앞의 함수들부터 보자면
int abs(int a)는 절댓값
int max(int a, int b)는 둘중 큰 수
void swap(int x1,int y1,int x2,int y2) 는 arr[x1][y1]과 arr[x2][y2]를 스왑하는 함수이다.
int count()는 먹을수있는 사탕의 최대갯수를 반환하는 함수인데,
for(int j=1; j<=n; j++){
if(pre == arr[j][i]) cnt++;
else{
pre = arr[j][i];
ret = max(ret,cnt);
cnt = 1;
}
}
이 부분에서 1부터 시작한것은 기초값이 윗줄에 미리 정해져있기 때문이며,
만약 pre가 arr의 값과 다르다면 pre를 갱신해주면서 최대값또한 갱신한다.
이렇게 해주는 이유는 앞에 캔디 두쌍 후 뒤에 캔디 3쌍같은경우는
실제로 최대값이 3이기 때문에
pre를 갱신해줘야 3까지 제대로 가져올 수 있다.
그리고 j<=n이기 때문에 배열의 제일 끝부분인 '\0'과도 비교를 하기 때문에
정상적으로 마지막 값을 ret에 넣을 수 있다.
if(abs(x1-x2) == 1 && abs(y1-y2) == 0){
main함수의 이 줄은 두 위치가 서로 근접해있는지를 판별한다.
이정도만 신경써주면
깔끔하게 AC.
구현이 좀 귀찮았다.
반응형