본문 바로가기

백준

C++[백준]3085번 사탕 게임

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