Hello World!

[BOJ] 3085번: 사탕 게임 본문

알고리즘/baekjoon

[BOJ] 3085번: 사탕 게임

qkrgusdk 2020. 3. 25. 01:29

문제 링크: 백준/BOJ https://www.acmicpc.net/problem/3085

 

3085번: 사탕 게임

문제 상근이는 어렸을 적에 "봄보니 (Bomboni)" 게임을 즐겨했다. 가장 처음에 N×N크기에 사탕을 채워 놓는다. 사탕의 색은 모두 같지 않을 수도 있다. 상근이는 사탕의 색이 다른 인접한 두 칸을 고른다. 그 다음 고른 칸에 들어있는 사탕을 서로 교환한다. 이제, 모두 같은 색으로 이루어져 있는 가장 긴 연속 부분(행 또는 열)을 고른 다음 그 사탕을 모두 먹는다. 사탕이 채워진 상태가 주어졌을 때, 상근이가 먹을 수 있는 사탕의 최대 개수를 구하

www.acmicpc.net

 

 2주 전에 처음 풀었을 때는 무한 맞왜틀하다가 다시 풀어보니까 한번에 통과해서 기분 좋았던 문제다.

사실 생각을 할 것이 별로 없는 문제다. n이 최대 50이니 무식하게 완탐 돌려도 o(n^4)니까 제한 시간 안에 충분히 돈다.

사탕 교환은 인접한 서로 다른 사탕 2개에 한해서만 수행되므로 swap 후 먹을 수 있는 최대 사탕 개수 계산 후 다시 swap으로 되돌려야 한다는 점을 주의해줘야 한다. 또한 내가 맞왜틀했던 원인은 최대 사탕 개수는 교환이 이루어진 행과 열에서 나오지 않을 수도 있다는 점을 간과했기 때문이다.

 

/*
20200322
3085번 - 사탕 게임
*/
#include <iostream>
#include <string>
using namespace std;

char arr[50][50]; int ans = 1;
void func(int n) {
	char target; int sum = 1;
	//각각 행과 열 검사 - > o(n^2)
	for (int i = 0; i < n; ++i) {
		target = arr[i][0];
		sum = 1;
		for (int j = 1; j < n; ++j) {
			if (target == arr[i][j]) {
				sum++;
				if (ans < sum)
					ans = sum;
				continue;
			}
			target = arr[i][j];
			sum = 1;
		}
	}
	
	for (int i = 0; i < n; ++i) {
		target = arr[0][i];
		sum = 1;
		for (int j = 1; j < n; ++j) {
			if (target == arr[j][i]) {
				sum++;
				if (ans < sum)
					ans = sum;
				continue;
			}
			target = arr[j][i];
			sum = 1;
		}
	}
}

int main() {
	cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false);
	int n;
	cin >> n;
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < n; ++j) {
			cin >> arr[i][j];
		}
	}

	//o(n^2)만큼 사탕 교환함
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < n; ++j) {
			if (i < n - 1 && arr[i][j] != arr[i + 1][j]) {
				swap(arr[i][j], arr[i + 1][j]);
				func(n);
				swap(arr[i][j], arr[i + 1][j]);
			}
			if (j < n - 1 && arr[i][j] != arr[i][j + 1]) {
				swap(arr[i][j], arr[i][j + 1]);
				func(n);
				swap(arr[i][j], arr[i][j + 1]);
			}
		}
	}

	cout << ans;
}

'알고리즘 > baekjoon' 카테고리의 다른 글

[BOJ] 1931번: 회의실 배정  (0) 2020.03.29
[BOJ] 1120번: 문자열  (0) 2020.03.29
[BOJ] 1107: 리모컨  (0) 2020.03.25
[BOJ] 1406: 에디터  (0) 2020.03.15
[BOJ] 9093번: 단어 뒤집기  (0) 2020.03.14
Comments