πŸ™‡β€β™€οΈ[Silver II] 사탕 κ²Œμž„ - 3085

문제 링크

μ„±λŠ₯ μš”μ•½

λ©”λͺ¨λ¦¬: 2020 KB, μ‹œκ°„: 36 ms

λΆ„λ₯˜

브루트포슀 μ•Œκ³ λ¦¬μ¦˜, κ΅¬ν˜„

제좜 일자

2023λ…„ 12μ›” 22일 13:54:56

문제 μ„€λͺ…

μƒκ·Όμ΄λŠ” 어렸을 적에 "λ΄„λ³΄λ‹ˆ (Bomboni)" κ²Œμž„μ„ μ¦κ²¨ν–ˆλ‹€.

κ°€μž₯ μ²˜μŒμ— NΓ—N크기에 사탕을 μ±„μ›Œ λ†“λŠ”λ‹€. μ‚¬νƒ•μ˜ 색은 λͺ¨λ‘ 같지 μ•Šμ„ μˆ˜λ„ μžˆλ‹€. μƒκ·Όμ΄λŠ” μ‚¬νƒ•μ˜ 색이 λ‹€λ₯Έ μΈμ ‘ν•œ 두 칸을 κ³ λ₯Έλ‹€. κ·Έ λ‹€μŒ κ³ λ₯Έ 칸에 λ“€μ–΄μžˆλŠ” 사탕을 μ„œλ‘œ κ΅ν™˜ν•œλ‹€. 이제, λͺ¨λ‘ 같은 μƒ‰μœΌλ‘œ 이루어져 μžˆλŠ” κ°€μž₯ κΈ΄ 연속 λΆ€λΆ„(ν–‰ λ˜λŠ” μ—΄)을 κ³ λ₯Έ λ‹€μŒ κ·Έ 사탕을 λͺ¨λ‘ λ¨ΉλŠ”λ‹€.

사탕이 μ±„μ›Œμ§„ μƒνƒœκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 상근이가 먹을 수 μžˆλŠ” μ‚¬νƒ•μ˜ μ΅œλŒ€ 개수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 λ³΄λ“œμ˜ 크기 N이 주어진닀. (3 ≀ N ≀ 50)

λ‹€μŒ N개 μ€„μ—λŠ” λ³΄λ“œμ— μ±„μ›Œμ Έ μžˆλŠ” μ‚¬νƒ•μ˜ 색상이 주어진닀. 빨간색은 C, νŒŒλž€μƒ‰μ€ P, μ΄ˆλ‘μƒ‰μ€ Z, λ…Έλž€μƒ‰μ€ Y둜 주어진닀.

μ‚¬νƒ•μ˜ 색이 λ‹€λ₯Έ μΈμ ‘ν•œ 두 칸이 μ‘΄μž¬ν•˜λŠ” μž…λ ₯만 주어진닀.

좜λ ₯

첫째 쀄에 상근이가 먹을 수 μžˆλŠ” μ‚¬νƒ•μ˜ μ΅œλŒ€ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

πŸš€ν’€μ΄

λ‚΄κ°€ μƒκ°ν•œ 이 문제의 ν•΄κ²° λ‘œμ§μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  1. 색이 μ„œλ‘œ λ‹€λ₯Έ μΈμ ‘ν•œ 사탕을 κ³ λ₯Έλ‹€. -> ν•˜λ‚˜μ˜ 사탕 λ‹Ή μƒν•˜μ’Œμš° λͺ¨λ‘ 탐색
  2. μœ„μΉ˜λ₯Ό λ³€κ²½ν•œλ‹€.
  3. μ΅œλŒ€μ˜ 길이λ₯Ό μ°ΎλŠ”λ‹€.
  4. λ³΄λ“œμ˜ λͺ¨λ“  κ²½μš°μ—μ„œ μœ„μ˜ ν–‰μœ„λ₯Ό λ°˜λ³΅ν•œλ‹€.

μœ„μ˜ λ‘œμ§λŒ€λ‘œ ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };
void solve()
{
	int res = 0;

	for (int y = 0; y < n; ++y)
	{
		for (int x = 1; x < n; ++x)
		{
			for (int i = 0; i < 4; ++i)
			{
				int ny = y + dy[i];
				int nx = x + dx[i];

				if (ny < 0 || nx < 0 || ny >= n || nx >= n)
					continue;
				if (board[y][x] == board[ny][nx])
					continue;
				swap(board[y][x], board[ny][nx]);
				res = max(res, check_lis());
				swap(board[y][x], board[ny][nx]);
			}
		}
	}

	cout << res << '\n';
}

첫 이쀑 for문은 λ³΄λ“œμ˜ λͺ¨λ“  μœ„μΉ˜λ₯Ό νƒμƒ‰ν•˜λŠ” 것이고 λ§ˆμ§€λ§‰ for문은 μƒν•˜μ’Œμš°λ₯Ό νƒμƒ‰ν•˜λŠ” 것이닀.
swap을 ν•΄μ„œ μœ„μΉ˜λ₯Ό λ³€κ²½ν•΄μ£Όμ—ˆκ³ , check_lisν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄μ„œ μ΅œλŒ€ 길이λ₯Ό μ°Ύμ•˜λ‹€.
λ¬Έμ œμ—μ„œ μ—¬λŸ¬λ²ˆ μœ„μΉ˜ 변경이 μ•ˆλ˜λ―€λ‘œ 원상 볡ꡬλ₯Ό μ‹œν‚¨λ‹€.

μ΅œλŒ€ 길이λ₯Ό μ°ΎλŠ” ν•¨μˆ˜λŠ” μ•„λž˜μ™€ 같이 κ΅¬ν˜„ν•˜μ˜€λ‹€.

int check_lis()
{
	int res = 0, cnt = 0;
	char ch;

	for (int y = 0; y < n; ++y)
	{
		ch = board[y][0];
		cnt = 1;

		for (int x = 1; x < n; ++x)
		{
			if (ch == board[y][x])
			{
				cnt++;
				res = max(res, cnt);
			}
			else
			{
				cnt = 1;
				ch = board[y][x];
			}
		}
	}

	for (int x = 0; x < n; ++x)
	{
		ch = board[0][x];
		cnt = 1;

		for (int y = 1; y < n; ++y)
		{
			if (ch == board[y][x])
			{
				cnt++;
				res = max(res, cnt);
			}
			else
			{
				cnt = 1;
				ch = board[y][x];
			}
		}
	}

	return res;
}

μ’€ 더 λ‚˜μ€ μ½”λ“œκ°€ μžˆμ„κ±°κ°™μ€λ° 잘 생각이 μ•ˆλ‚˜μ„œ μžˆλŠ” κ·Έλž˜λ„ ν’€μ—ˆλ‹€.

ν–‰κ³Ό μ—΄ λͺ¨λ‘ μƒκ°ν•΄μ•Όν•˜λ―€λ‘œ 첫 이쀑 for문은 행을 νƒμƒ‰ν•˜μ—¬ μ΅œλŒ€ 길이λ₯Ό μ°Ύκ³ , κ·Έ λ’€λŠ” 열을 νƒμƒ‰ν•˜μ—¬ μ΅œλŒ€ 길이λ₯Ό μ°ΎλŠ”λ‹€.

λ¬Έμžμ—΄μ΄ λ‹¬λΌμ§ˆ λ•Œ, cntκ°€ 1λΆ€ν„° μ‹œμž‘ν•΄μ•Όν•œλ‹€.
이거 ν—·κ°ˆλ €μ„œ 5뢄은 더 λ‚ λ¦°λ“―?

πŸš€μ „μ²΄ μ½”λ“œ

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int n, res = 0;
vector<vector<char>> board;

void setting()
{
	cin >> n;
	board = vector<vector<char>>(n, vector<char>(n));

	for (int y = 0; y < n; ++y)
		for (int x = 0; x < n; ++x)
			cin >> board[y][x];
}

// 문제의 ν•΄κ²° 둜직
// 1. 색이 μ„œλ‘œ λ‹€λ₯Έ μΈμ ‘ν•œ 사탕을 κ³ λ₯Έλ‹€. -> ν•˜λ‚˜μ˜ 사탕 λ‹Ή μƒν•˜μ’Œμš°
// 2. μœ„μΉ˜λ₯Ό λ³€κ²½ν•œλ‹€.
// 3. μ΅œλŒ€ 길이 μˆ˜μ—΄μ„ μ°ΎλŠ”λ‹€.
// 4. λ³΄λ“œμ˜ λͺ¨λ“  κ²½μš°μ—μ„œ μœ„μ˜ ν–‰μœ„λ₯Ό λ°˜λ³΅ν•œλ‹€.
int check_lis()
{
	int res = 0, cnt = 0;
	char ch;

	for (int y = 0; y < n; ++y)
	{
		ch = board[y][0];
		cnt = 1;

		for (int x = 1; x < n; ++x)
		{
			if (ch == board[y][x])
			{
				cnt++;
				res = max(res, cnt);
			}
			else
			{
				cnt = 1;
				ch = board[y][x];
			}
		}
	}

	for (int x = 0; x < n; ++x)
	{
		ch = board[0][x];
		cnt = 1;

		for (int y = 1; y < n; ++y)
		{
			if (ch == board[y][x])
			{
				cnt++;
				res = max(res, cnt);
			}
			else
			{
				cnt = 1;
				ch = board[y][x];
			}
		}
	}

	return res;
}

int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };
void solve()
{
	int res = 0;

	for (int y = 0; y < n; ++y)
	{
		for (int x = 1; x < n; ++x)
		{
			for (int i = 0; i < 4; ++i)
			{
				int ny = y + dy[i];
				int nx = x + dx[i];

				if (ny < 0 || nx < 0 || ny >= n || nx >= n)
					continue;
				if (board[y][x] == board[ny][nx])
					continue;
				swap(board[y][x], board[ny][nx]);
				res = max(res, check_lis());
				swap(board[y][x], board[ny][nx]);
			}
		}
	}

	cout << res << '\n';
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	//freopen("input.txt", "rt", stdin);

	setting();
	solve();

	return 0;
}

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ: