Notice
Recent Posts
Recent Comments
Link
Hello World!
[BOJ] 3085번: 사탕 게임 본문
문제 링크: 백준/BOJ https://www.acmicpc.net/problem/3085
3085번: 사탕 게임
문제 상근이는 어렸을 적에 "봄보니 (Bomboni)" 게임을 즐겨했다. 가장 처음에 N×N크기에 사탕을 채워 놓는다. 사탕의 색은 모두 같지 않을 수도 있다. 상근이는 사탕의 색이 다른 인접한 두 칸을 고른다. 그 다음 고른 칸에 들어있는 사탕을 서로 교환한다. 이제, 모두 같은 색으로 이루어져 있는 가장 긴 연속 부분(행 또는 열)을 고른 다음 그 사탕을 모두 먹는다. 사탕이 채워진 상태가 주어졌을 때, 상근이가 먹을 수 있는 사탕의 최대 개수를 구하
www.acmicpc.net
2주 전에 처음 풀었을 때는 무한 맞왜틀하다가 다시 풀어보니까 한번에 통과해서 기분 좋았던 문제다.
사실 생각을 할 것이 별로 없는 문제다. n이 최대 50이니 무식하게 완탐 돌려도 o(n^4)니까 제한 시간 안에 충분히 돈다.
사탕 교환은 인접한 서로 다른 사탕 2개에 한해서만 수행되므로 swap 후 먹을 수 있는 최대 사탕 개수 계산 후 다시 swap으로 되돌려야 한다는 점을 주의해줘야 한다. 또한 내가 맞왜틀했던 원인은 최대 사탕 개수는 교환이 이루어진 행과 열에서 나오지 않을 수도 있다는 점을 간과했기 때문이다.
/*
20200322
3085번 - 사탕 게임
*/
#include <iostream>
#include <string>
using namespace std;
char arr[50][50]; int ans = 1;
void func(int n) {
char target; int sum = 1;
//각각 행과 열 검사 - > o(n^2)
for (int i = 0; i < n; ++i) {
target = arr[i][0];
sum = 1;
for (int j = 1; j < n; ++j) {
if (target == arr[i][j]) {
sum++;
if (ans < sum)
ans = sum;
continue;
}
target = arr[i][j];
sum = 1;
}
}
for (int i = 0; i < n; ++i) {
target = arr[0][i];
sum = 1;
for (int j = 1; j < n; ++j) {
if (target == arr[j][i]) {
sum++;
if (ans < sum)
ans = sum;
continue;
}
target = arr[j][i];
sum = 1;
}
}
}
int main() {
cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false);
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin >> arr[i][j];
}
}
//o(n^2)만큼 사탕 교환함
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (i < n - 1 && arr[i][j] != arr[i + 1][j]) {
swap(arr[i][j], arr[i + 1][j]);
func(n);
swap(arr[i][j], arr[i + 1][j]);
}
if (j < n - 1 && arr[i][j] != arr[i][j + 1]) {
swap(arr[i][j], arr[i][j + 1]);
func(n);
swap(arr[i][j], arr[i][j + 1]);
}
}
}
cout << ans;
}
'알고리즘 > baekjoon' 카테고리의 다른 글
[BOJ] 1931번: 회의실 배정 (0) | 2020.03.29 |
---|---|
[BOJ] 1120번: 문자열 (0) | 2020.03.29 |
[BOJ] 1107: 리모컨 (0) | 2020.03.25 |
[BOJ] 1406: 에디터 (0) | 2020.03.15 |
[BOJ] 9093번: 단어 뒤집기 (0) | 2020.03.14 |
Comments