Rylah's Study & Daily Life

[BOJ/C++] 3085. 사탕 게임 본문

BOJ/03. Brute Force

[BOJ/C++] 3085. 사탕 게임

Rylah 2022. 1. 15. 13:24

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

 

3085번: 사탕 게임

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

www.acmicpc.net

 

문제

상근이는 어렸을 적에 "봄보니 (Bomboni)" 게임을 즐겨했다.

가장 처음에 N×N크기에 사탕을 채워 놓는다. 사탕의 색은 모두 같지 않을 수도 있다. 상근이는 사탕의 색이 다른 인접한 두 칸을 고른다. 그 다음 고른 칸에 들어있는 사탕을 서로 교환한다. 이제, 모두 같은 색으로 이루어져 있는 가장 긴 연속 부분(행 또는 열)을 고른 다음 그 사탕을 모두 먹는다.

사탕이 채워진 상태가 주어졌을 때, 상근이가 먹을 수 있는 사탕의 최대 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 보드의 크기 N이 주어진다. (3 ≤ N ≤ 50)

다음 N개 줄에는 보드에 채워져 있는 사탕의 색상이 주어진다. 빨간색은 C, 파란색은 P, 초록색은 Z, 노란색은 Y로 주어진다.

사탕의 색이 다른 인접한 두 칸이 존재하는 입력만 주어진다.

출력

첫째 줄에 상근이가 먹을 수 있는 사탕의 최대 개수를 출력한다.

풀이 방법

1. Brute Force

 N이 50으로 매우 작으므로 2중 반복문인 Brute Force로 풀어도 충분한 시간이다.

 

1. 열인 j를 swap하고 가장 길이가 긴 문자의 수를 maxNum으로 Check

2. 행이 i를 swap하고 가장 길이가 긴 문자의 수를 maxNum으로 Check

 

swap을 하고나면 재 스왑으로 원상태로 복원하는 것은 필수

 

반복하면 결과가 도출된다.

 

// Code Plus BasicA
// 0x01. Brute Force
// Written by Rylah
// Written Date : 2022.01.15
// https://minteul.tistory.com/314
// https://www.acmicpc.net/source/37584615

// 3085. 사탕 게임
// Idea
// Brute Force
// j - Swap count Max
// i - swap count max
// result = max
// index warning 
#include <bits/stdc++.h>
using namespace std;
string board[51];

int solve(int n)
{
	int result = 1;

	for (int i = 0; i < n; i++) 
	{
		int cnt = 1;
		for (int j = 1; j < n; j++)
		{
			if (board[i][j] == board[i][j - 1])
				cnt++;
			else
				cnt = 1;
			if (result < cnt)
				result = cnt;
		}

		cnt = 1;

		for (int j = 1; j < n; j++)
		{
			if (board[j][i] == board[j - 1][i])
				cnt++;
			else
				cnt = 1;
			if (result < cnt)
				result = cnt;
		}
	}
	return result;
}

int main(void)
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> board[i];

	int maxNum = -1;
	
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (j + 1 < n)
			{
				swap(board[i][j], board[i][j + 1]);
				maxNum = max(maxNum, solve(n));
				swap(board[i][j], board[i][j + 1]);
			}

			if (i + 1 < n)
			{
				swap(board[i][j], board[i + 1][j]);
				maxNum = max(maxNum, solve(n));
				swap(board[i][j], board[i + 1][j]);
			}
		}
	}
	cout << maxNum << "\n";
	
	return 0;
}

'BOJ > 03. Brute Force' 카테고리의 다른 글

[BOJ/C++] 1476. 날짜 계산  (0) 2022.01.15
[BOJ/C++] 2309. 일곱 난쟁이  (0) 2022.01.14