https://www.acmicpc.net/problem/3085
처음의 생각은 초기 상태도 생각해줘야하니, 초기 상태에서의 최대 갯수를 구하려했다.(예시 2)
하지만 생각해보면 PPPP에서 오른쪽으로 2개 교환해도 결국엔 같으니, 그건 의미없다 판단.
오른쪽으로 한번 OR 아래로 한번 교체를 해주면 결국엔 모든 사탕을 교체할 수 있으니, 케이스가 2가지다.
교체를 하고, 확인하고 , 다시 원상태를 위한 교체를 해줘야한다. 안해주면 다음 번 케이스를 하려 할 때 이미 바뀐 거로 해야하니 오류가 남.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int check(vector<string>& v)
{
int big = 1;
int n = v.size();
for (int i = 0; i < n; i++)
{
int temp = 1;
for (int j = 1; j < n; j++) // 가로
{
if (v[i][j] == v[i][j - 1])
temp++;
else
temp = 1;
if (temp > big)
big = temp;
}
temp = 1;
for (int j = 1; j < n; j++) // 세로
{
if (v[j][i] == v[j - 1][i])
temp++;
else
temp = 1;
if (temp > big)
big = temp;
}
}
return big;
}
int main()
{
int n;
cin >> n;
vector<string> v(n);
for (int i = 0; i < n; i++)
cin >> v[i];
int answer = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (j + 1 < n)
{
swap(v[i][j], v[i][j + 1]); // 교체
int temp = check(v); // 갯수 체크
if (answer < temp)
answer = temp;
swap(v[i][j], v[i][j + 1]); // 다시 원상태로 교체
}
if (i + 1 < n)
{
swap(v[i][j], v[i + 1][j]);
int temp = check(v);
if (answer < temp)
answer = temp;
swap(v[i][j], v[i + 1][j]);
}
}
}
cout << answer << '\n';
return 0;
}
'백준 문제풀이 > 실버3' 카테고리의 다른 글
백준 1213번 - 팰린드롬 만들기 (0) | 2022.07.05 |
---|---|
백준 14425번 - 문자열 집합 (0) | 2022.06.08 |
백준 2108번 - 통계학 (0) | 2022.06.01 |
백준 1929번 - 소수 구하기 (0) | 2022.03.02 |
백준 1269번 - 대칭 차집합 (0) | 2021.10.22 |