본문 바로가기

코딩테스트/C++

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

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

 

이것도 브루트 포스로 푸는 문제이다. 단순히 바꾸고 구하고를 반복해보자.

 

사탕의 색은 char a[51][51]로 선언해주고 이중 for문을 통해 값을 받아온다.

 

swap이라는 함수를 통해 두개의 색을 바꿔줄 수있도록 하였다.

 

바꾸고 나서 가로행과 세로행의 가장 긴 이어지는 갯수를 세어주었는데, 가로행 바꾸기와 세로행 바꾸기 똑같이 써야해서 check라는 함수로 만들어주었다. 

 

쓰는 변수를 지역변수에서 전역변수로 바꿔주고 가로행검사, 세로행 검사 각각 따로 진행하고 그 중 가장 긴 이어지는 값을 max1에 저장해 주었다.

 

코드는 다음과 같다.

 

#include <iostream>
#include <algorithm>
using namespace std;
 
char a[51][51];
int max1 = 1;
int n;
void check();
int main(int argc, char* argv[])
{
	cin >> n;
	for (int i = 0;i < n;i++) {
		for (int j = 0;j < n;j++) {
			cin >> a[i][j];
		}
	}
 
	for (int i = 0;i < n;i++) {
		for (int j = 0;j < n - 1;j++) {
			swap(a[i][j], a[i][j + 1]);
			check();
			swap(a[i][j], a[i][j + 1]);
		}
	}
 
	for (int i = 0;i < n - 1;i++) {
		for (int j = 0;j < n;j++) {
			swap(a[i][j], a[i + 1][j]);
			check();
			swap(a[i][j], a[i + 1][j]);
		}
	}
 
	cout << max1 << '\n';
 
	return 0;
}
void check() {
	char c;
	//가로행 검사
	for (int i = 0;i < n;i++) {
		int count = 1;
		c = a[i][0];
		for (int j = 1;j < n;j++) {
			if (c == a[i][j]) {
				count++;
			}
			else {
				count = 1;
			}
			c = a[i][j];
			max1 = max(max1, count);
		}
	}
	//세로행 검사
	for (int i = 0;i < n;i++) {
		int count = 1;
		c = a[0][i];
		for (int j = 1;j < n;j++) {
			if (c == a[j][i]) {
				count++;
			}
			else {
				count = 1;
			}
			c = a[j][i];
			max1 = max(max1, count);
		}
	}
}

 

그냥 무작정 다 계산해버리면 되서 편하긴하다. 하지만 손은 좀더 힘들거같다. 머리가 나쁘면 몸이 고생하는 느낌의 브루트 포스이다.