※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 3085번 문제인 사탕 게임이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/3085 

 

3085번: 사탕 게임

예제 3의 경우 4번 행의 Y와 C를 바꾸면 사탕 네 개를 먹을 수 있다.

www.acmicpc.net

입력의 크기가 매우 제한적이므로, 모든 바꿀 수 있는 쌍에 대하여 (1) 해당 쌍을 서로 바꾼 뒤 (2) 모두 같은 색으로 이루어져 있는 가장 긴 연속 부분을 찾는 것을 반복하는 것으로 문제를 해결할 수 있다.

 

swap을 이용하면 쌍을 서로 바꾸는 것을 간결히 구현할 수 있다.

 

아래는 제출한 소스코드이다:

#include <iostream>
#include <string>
#include <utility>
using namespace std;

int N;
string board[50];

int func() {
	int ret = 0;
	for (int r = 0; r < N; r++) {
		int combo = 0; char old = '.';
		for (int c = 0; c < N; c++) {
			if (board[r][c] == old) combo++;
			else {
				ret = max(ret, combo);
				old = board[r][c];
				combo = 1;
			}
		}
		ret = max(ret, combo);
	}
	for (int c = 0; c < N; c++) {
		int combo = 0; char old = '.';
		for (int r = 0; r < N; r++) {
			if (board[r][c] == old) combo++;
			else {
				ret = max(ret, combo);
				old = board[r][c];
				combo = 1;
			}
		}
		ret = max(ret, combo);
	}

	return ret;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N;
	for (int i = 0; i < N; i++) cin >> board[i];

	int ans = 0;

	for (int r = 1; r < N; r++) {
		for (int c = 0; c < N; c++) {
			if (board[r][c] != board[r - 1][c]) {
				swap(board[r][c], board[r - 1][c]);
				ans = max(ans, func());
				swap(board[r][c], board[r - 1][c]);
			}
		}
	}

	for (int r = 0; r < N; r++) {
		for (int c = 1; c < N; c++) {
			if (board[r][c] != board[r][c - 1]) {
				swap(board[r][c], board[r][c - 1]);
				ans = max(ans, func());
				swap(board[r][c], board[r][c - 1]);
			}
		}
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 3512 // C++] Flat  (0) 2022.11.12
[BOJ 16099 // C++] Larger Sport Facility  (1) 2022.11.12
[BOJ 24623 // C++] Изгороди  (0) 2022.11.12
[BOJ 25277 // C++] Culture shock  (0) 2022.11.11
[BOJ 24296 // C++] ЛИНИЯ  (0) 2022.11.11

+ Recent posts