[백준3085] 사탕게임 (C++)

유후·2022년 5월 9일
0

백준

목록 보기
25/66

BOJ 바로가기

문제를 푸는 데 번역 때문에 오해의 소지가 있었다.

상근이는 사탕의 색이 다른 인접한 두 칸을 고른다. 그 다음 고른 칸에 들어있는 사탕을 서로 교환한다.
▷ 사탕의 색이 서로 다르지 않아도 인접한 두 칸을 골라 바꿀 수 있다.

+) 백준 알고리즘 강의에 있는 소스코드를 보고 공부해는데, check함수에서 cnt를 늘려주는 부분에 오류가 있는 것 같아 수정해서 제출했더니 맞았다.

배열을 자유자재로 다루는 능력을 키우는 데 도움이 될 듯한 문제이다.

#include <iostream>
using namespace std;

void swap(char* a, char* b)
{
	char temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

int check(char arr[50][50], int n)
{
	int cnt, ans = 1;
	// 행 체크
	for (int i = 0; i < n; i++)
	{
		cnt = 1;
		for (int j = 0; j < n - 1; j++)
		{
			if (arr[i][j] == arr[i][j + 1])
				cnt++;
			else
			{
				if (ans < cnt)
					ans = cnt;
				cnt = 1;
			}
		}
		if (ans < cnt)
			ans = cnt;
	}
	// 열 체크
	for (int j = 0; j < n; j++)
	{
		cnt = 1;
		for (int i = 0; i < n - 1; i++)
		{
			if (arr[i][j] == arr[i + 1][j])
				cnt++;
			else
			{
				if (ans < cnt)
					ans = cnt;
				cnt = 1;
			}
		}
		if (ans < cnt)
			ans = cnt;
	}
	return ans;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int n, ans = 1;
	char arr[50][50];
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> arr[i];
	// 행 바꾸기
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n - 1; j++)
		{
			swap(&arr[i][j], &arr[i][j + 1]);
			if (check(arr, n) > ans)
				ans = check(arr, n);
			swap(&arr[i][j], &arr[i][j + 1]);
		}
	}
	// 열 바꾸기
	for (int j = 0; j < n; j++)
	{
		for (int i = 0; i < n - 1; i++)
		{
			swap(&arr[i][j], &arr[i + 1][j]);				
			if (check(arr, n) > ans)
				ans = check(arr, n);
			swap(&arr[i][j], &arr[i + 1][j]);
		}
	}
	cout << ans << '\n';
}
profile
이것저것 공부하는 대학생

0개의 댓글