코딩고치

[백준][브루트 포스] 사탕 게임 본문

백준 알고리즘 기초/브루트 포스

[백준][브루트 포스] 사탕 게임

코딩고치 2020. 4. 2. 23:01

1. 문제 주소

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

 

3085번: 사탕 게임

문제 상근이는 어렸을 적에 "봄보니 (Bomboni)" 게임을 즐겨했다. 가장 처음에 N×N크기에 사탕을 채워 놓는다. 사탕의 색은 모두 같지 않을 수도 있다. 상근이는 사탕의 색이 다른 인접한 두 칸을 고른다. 그 다음 고른 칸에 들어있는 사탕을 서로 교환한다. 이제, 모두 같은 색으로 이루어져 있는 가장 긴 연속 부분(행 또는 열)을 고른 다음 그 사탕을 모두 먹는다. 사탕이 채워진 상태가 주어졌을 때, 상근이가 먹을 수 있는 사탕의 최대 개수를 구하

www.acmicpc.net

2. 문제

Y C P Z Y
C Y Z Z P
C C P P P
Y C Y Z C
C P P Z Z

다음과 같이 사탕이 배치되어 있을 때 가장 긴 연속 부분의 사탕 수를 구하는 candy_num 함수를 작성을 하였다. 먼저 각 행을 돌면서 기준이 되는 사탕의 오른쪽과 같은지를 확인하여 연속 부분의 길이를 구하였다. 그러고 나서 각 열을 돌면서 아래쪽의 사탕과 같은지 확인하여 연속 부분의 길이를 구하여 둘 중 큰 값을 return 하도록 코드를 구성하였다.

main 함수에는 swap을 이용하여 한개의 이웃한 사탕을 교환 후 candy_num 함수를 이용하여 가장 긴 연속 부분의 길이를 구하도록 코드를 작성하였다.

3. 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int candy_num(vector<string>& candyboard) {
    int n = candyboard.size();
    int max_num = 1;
    for (int i = 0; i < n; i++) {
        int candy_count = 1;
        for (int j = 0; j < n - 1; j++) {
            if (candyboard[i][j] == candyboard[i][j + 1]) {
                candy_count += 1;
            }
            else candy_count = 1;
            if (candy_count > max_num)
                max_num = candy_count;
        }
 
        candy_count = 1;
        for (int k = 0; k < n - 1; k++) {
            if (candyboard[k][i] == candyboard[k + 1][i]) {
                candy_count += 1;
            }
            else candy_count = 1;
            
            if (candy_count > max_num)
                max_num = candy_count;
        }
    }
    return max_num;
}
 
int main() {
    int n;
    cin >> n;
 
    vector<string> candyboard(n);
 
    for (int i = 0; i < n; i++)
        cin >> candyboard[i];
    int max_num = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - 1; j++) {
            swap(candyboard[i][j], candyboard[i][j + 1]);
            if (max_num < candy_num(candyboard))
                max_num = candy_num(candyboard);
            swap(candyboard[i][j], candyboard[i][j + 1]);
        }
        for (int k = 0; k < n - 1; k++) {
            swap(candyboard[k][i], candyboard[k + 1][i]);
            if (max_num < candy_num(candyboard))
                max_num = candy_num(candyboard);
            swap(candyboard[k][i], candyboard[k + 1][i]);
        }
    }
    cout << max_num << '\n';
    return 0;    
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 
Comments