https://www.acmicpc.net/problem/3085
3085번: 사탕 게임
예제 3의 경우 4번 행의 Y와 C를 바꾸면 사탕 네 개를 먹을 수 있다.
www.acmicpc.net
솔루션
조금 무식하게 짜서.. 코드가 길다..
나는 각자 앞에 문자와, 아래에 있는 문자를 교환 한 다음, 각 행, 각 열에 대해서 가장 긴 수열을 체크했다.
처음에 문제 이해를 잘 못 해서 한번 틀렸지만, 금방 고칠 수 있었다! (함수를 만들어서 짜니까 수정하기도 편한 듯?!)
코드
#include <iostream>
using namespace std;
char arr[52][52];
int N;
int cnt;
int calcRowMax(int r) {
int idx = 0;
int maxCnt = 0;
while (idx < N) {
int count = 0;
char ref = arr[r][idx];
while (arr[r][idx] == ref && idx<N) {
count++;
idx++;
}
maxCnt = max(maxCnt, count);
}
return maxCnt;
}
int calcColMax(int col) {
int idx = 0;
int maxCnt = 0;
while (idx < N) {
int count = 0;
char ref = arr[idx][col];
while (arr[idx][col] == ref && idx < N) {
count++;
idx++;
}
maxCnt = max(maxCnt, count);
}
return maxCnt;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> arr[i][j];
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
char cur = arr[i][j];
if (j + 1 < N) {
char tmp = arr[i][j + 1];
arr[i][j] = tmp;
arr[i][j + 1] = cur;
cnt = max(cnt, calcRowMax(i));
cnt = max(cnt, calcColMax(j + 1));
cnt = max(cnt, calcColMax(j));
arr[i][j] = cur;
arr[i][j + 1] = tmp;
}
if (i + 1 < N) {
char tmp = arr[i + 1][j];
arr[i][j] = tmp;
arr[i + 1][j] = cur;
cnt = max(cnt, calcRowMax(i));
cnt = max(cnt, calcRowMax(i + 1));
cnt = max(cnt, calcColMax(j));
arr[i][j] = cur;
arr[i + 1][j] = tmp;
}
}
}
cout << cnt << "\n";
}
'백준' 카테고리의 다른 글
C++[백준]15649번 N과 M (1) (0) | 2023.01.31 |
---|---|
C++[백준]1748번 수 이어 쓰기 1 (0) | 2023.01.31 |
C++[백준]17103번 골드바흐 파티션 (0) | 2023.01.26 |
C++[백준]12026번 BOJ 거리 (0) | 2023.01.26 |
C++[백준]2563번 색종이 (2) | 2023.01.17 |