반응형

문제 링크

 

3085번: 사탕 게임

첫째 줄에 상근이가 먹을 수 있는 사탕의 최대 개수를 출력한다.

www.acmicpc.net

 

풀이

  먼저 가로로 2칸을 바꿔서 가장 긴 줄을 찾는다. 가장 긴 줄을 찾을 때는 가로로 확인한 이후, 세로를 확인했다.

  이후 세로로 2칸을 바꾼 후 가로, 세로를 확인하여 가장 긴 줄을 확인한다.

#include <cstdio>
#include <algorithm>

using namespace std;

int n;
char board[50][51];

int func(void){
  int ret = 1;
  for(int i = 0; i < n; ++i){
    for(int j = 0; j < n-1; ++j){
      int tmp = 1;
      for(int k = j; k < n-1; ++k){
        if(board[i][k] == board[i][k+1])
          tmp++;
        else
          break;
      }
      ret = max(ret, tmp);
    }
  }

  for(int i = 0; i < n-1; ++i){
    for(int j = 0; j < n; ++j){
      int tmp = 1;
      for(int k = i; k < n-1; ++k){
        if(board[k][j] == board[k+1][j])
          tmp++;
        else
          break;
      }
      ret = max(ret, tmp);
    }
  }
  return ret;
}

int main(void){
  int ans = 1;

  scanf("%d", &n);
  for(int i = 0; i < n; ++i)
    scanf("%s", board[i]);

  for(int i = 0; i < n; ++i){
    for(int j = 0; j < n-1; ++j){
      swap(board[i][j], board[i][j+1]);
      ans = max(ans, func());
      swap(board[i][j], board[i][j+1]);
    }
  }
  for(int i = 0; i < n-1; ++i){
    for(int j = 0; j < n; ++j){
      swap(board[i][j], board[i+1][j]);
      ans = max(ans, func());
      swap(board[i][j], board[i+1][j]);
    }
  }
  printf("%d\n", ans);
}

 

주의

  다시 판을 원래대로 돌려놓아야한다. ( for문에 swap 2번 )

반응형

+ Recent posts