BOJ 3085. μ¬ν κ²μ
πββοΈ[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λ‘ μ£Όμ΄μ§λ€.
μ¬νμ μμ΄ λ€λ₯Έ μΈμ ν λ μΉΈμ΄ μ‘΄μ¬νλ μ λ ₯λ§ μ£Όμ΄μ§λ€.
μΆλ ₯
첫째 μ€μ μκ·Όμ΄κ° λ¨Ήμ μ μλ μ¬νμ μ΅λ κ°μλ₯Ό μΆλ ₯νλ€.
πνμ΄
λ΄κ° μκ°ν μ΄ λ¬Έμ μ ν΄κ²° λ‘μ§μ λ€μκ³Ό κ°λ€.
- μμ΄ μλ‘ λ€λ₯Έ μΈμ ν μ¬νμ κ³ λ₯Έλ€. -> νλμ μ¬ν λΉ μνμ’μ° λͺ¨λ νμ
- μμΉλ₯Ό λ³κ²½νλ€.
- μ΅λμ κΈΈμ΄λ₯Ό μ°Ύλλ€.
- 보λμ λͺ¨λ κ²½μ°μμ μμ νμλ₯Ό λ°λ³΅νλ€.
μμ λ‘μ§λλ‘ ν¨μλ₯Ό ꡬννλ©΄ μλμ κ°λ€.
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;
}