본문 바로가기

Programming/Algorithm (C++)

[백준 3085] c++ :: 사탕 게임

부루투포스 알고리즘

hcr3066.tistory.com/26

 

알고리즘 기법[전체 탐색] - 브루트 포스(brute force)

암호학에서의 브루트 포스(brute force attack)가 아닌 알고리즘의 브루트 포스(brute force search)에 관한 것을 작성한다. 브루트 포스(brute force) brute: 무식한, force: 힘  무식한 힘으로 해석할 수 있다...

hcr3066.tistory.com

 

문제

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

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

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

입력

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

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

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

출력

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

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <stack>
#include <string>

using namespace std;
int n;
char map[50][50];

int eatCandy() {
	int ret = 1;

	for (int y = 0; y < n; y++) { 
		int count = 1;
		for (int x = 1; x < n; x++) { //x축에서 비교를 해줌
			if (map[y][x] == map[y][x - 1]) //전과 같은 것이 있으면 
				count++; //count 증가
			else count = 1; //같은 거 없으면 1로 둠
			ret = max(count, ret); //ret은 ret 그대로거나 count
		}
	}

	for (int x = 0; x < n; x++) { //y축에서 비교를 해줌
		int count = 1; //count=1로 초기화
		for (int y = 1; y < n; y++) {
			if (map[y][x] == map[y - 1][x]) //전과 같은 것이 있으면
				count++; //count 증가
			else
				count = 1; //없으면 그대로 1
			ret = max(count, ret); //ret 업데이트
		}
	} 
	return ret; //ret반환


}

int main()
{
	cin >> n; 
	for (int y = 0; y < n; y++) {
		for (int x=0; x < n; x++) {
			cin >> map[y][x]; //맵을 입력받은 문자로 채워 둔다
		}
	}

	int ans = 0;
	for (int y = 0; y < n; y++) {
		for (int x = 0; x < n; x++) {
			if (x + 1 < n) {
				swap(map[y][x], map[y][x + 1]); //바로 다음 (x축 옆)있는 것과 교환하고
				ans = max(ans, eatCandy()); // ans 를 업데이트 해준다
				swap(map[y][x], map[y][x + 1]); //그리고 다시 원래다로
			}

			if (y + 1 < n) {
				swap(map[y][x], map[y + 1][x]); //바로 다음 (y축 옆)있는 것과 교환하고
				ans = max(ans, eatCandy()); //ans를 업데이트 해준다
				swap(map[y][x], map[y + 1][x]); //그리고 다시 원래대로
			}
		}
	}

	cout << ans; //ans출력
	return 0;

}

 

'Programming > Algorithm (C++)' 카테고리의 다른 글

[백준 1260] c++ :: DFS와 BFS  (0) 2024.03.17
[백준 5567] c++ :: 결혼식  (1) 2021.04.07
rush02 정리  (0) 2021.03.16
c08  (0) 2021.03.11
c09  (0) 2021.03.11