문제를 푸는 데 번역 때문에 오해의 소지가 있었다.
상근이는 사탕의 색이 다른 인접한 두 칸을 고른다. 그 다음 고른 칸에 들어있는 사탕을 서로 교환한다.
▷ 사탕의 색이 서로 다르지 않아도 인접한 두 칸을 골라 바꿀 수 있다.
+) 백준 알고리즘 강의에 있는 소스코드를 보고 공부해는데, check함수에서 cnt를 늘려주는 부분에 오류가 있는 것 같아 수정해서 제출했더니 맞았다.
배열을 자유자재로 다루는 능력을 키우는 데 도움이 될 듯한 문제이다.
#include <iostream>
using namespace std;
void swap(char* a, char* b)
{
char temp;
temp = *a;
*a = *b;
*b = temp;
}
int check(char arr[50][50], int n)
{
int cnt, ans = 1;
// 행 체크
for (int i = 0; i < n; i++)
{
cnt = 1;
for (int j = 0; j < n - 1; j++)
{
if (arr[i][j] == arr[i][j + 1])
cnt++;
else
{
if (ans < cnt)
ans = cnt;
cnt = 1;
}
}
if (ans < cnt)
ans = cnt;
}
// 열 체크
for (int j = 0; j < n; j++)
{
cnt = 1;
for (int i = 0; i < n - 1; i++)
{
if (arr[i][j] == arr[i + 1][j])
cnt++;
else
{
if (ans < cnt)
ans = cnt;
cnt = 1;
}
}
if (ans < cnt)
ans = cnt;
}
return ans;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, ans = 1;
char arr[50][50];
cin >> n;
for (int i = 0; i < n; i++)
cin >> arr[i];
// 행 바꾸기
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n - 1; j++)
{
swap(&arr[i][j], &arr[i][j + 1]);
if (check(arr, n) > ans)
ans = check(arr, n);
swap(&arr[i][j], &arr[i][j + 1]);
}
}
// 열 바꾸기
for (int j = 0; j < n; j++)
{
for (int i = 0; i < n - 1; i++)
{
swap(&arr[i][j], &arr[i + 1][j]);
if (check(arr, n) > ans)
ans = check(arr, n);
swap(&arr[i][j], &arr[i + 1][j]);
}
}
cout << ans << '\n';
}