BOJ

백준 3085 - 사탕 게임

yanJuicy 2019. 5. 12. 17:03
반응형

문제

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

 

3085번: 사탕 게임

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

www.acmicpc.net

 

 

풀이

양옆으로 바꾸고 보드 전체를 검사하고 위아래로 바꾸고 보드 전체를 검사해야 한다.

보드 전체를 검사할 때도 가로 줄 검사와 세로줄 검사를 따로 해서 연속이 되는 사탕의 수를 찾으면 된다. 

 

1. board의 양옆을 바꾼다

2. board의 가로줄을 검사해서 최대 사탕길이를 찾는다

3. board의 세로줄을 검사해서 최대 사탕길이를 찾는다

4. board의 양옆을 다시 바꾼다 (원래 board로 복귀)

 

5. board의 위아래를 바꾼다

6. board의 가로줄을 검사해서 최대 사탕길이를 찾는다.

7. board의 세로줄을 검사해서 최대 사탕길이를 찾는다.

8. board의 위아래를 다시 바꾼다

 

 

코드

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <algorithm>
 
using namespace std;
 
int N;
char board[50][50];
 
void swap(char & x, char & y)
{
    int temp = x;
    x = y;
    y = temp;
}
 
int changed()
{
    int result = 1;
    int temp = 1;
 
    // 양옆 변경
    for (int y = 0; y < N; y++)
    {
        temp = 1;
        for (int x = 0; x < N - 1; x++)
        {
            if (board[y][x] == board[y][x + 1])
                temp++;
            else
            {
                result = max(result, temp);
                temp = 1;
            }
        }
        result = max(result, temp);
    }
 
    // 위 아래 변경
    for (int y = 0; y < N; y++)
    {
        temp = 1;
        for (int x = 0; x < N - 1; x++)
        {
            if (board[x][y] == board[x + 1][y])
                temp++;
            else
            {
                result = max(result, temp);
                temp = 1;
            }
        }
        result = max(result, temp);
    }
 
    return result;
}
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    cin >> N;
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            cin >> board[i][j];
        }
    }
 
    int result = 1;
 
    // 가로 변경
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N - 1; j++)
        {
            swap(board[i][j], board[i][j + 1]);
            result = max(result, changed());
            swap(board[i][j], board[i][j + 1]);
        }
    }
 
    // 세로 변경
    for (int i = 0; i < N - 1; i++)
    {
        for (int j = 0; j < N; j++)
        {
            swap(board[i][j], board[i + 1][j]);
            result = max(result, changed());
            swap(board[i][j], board[i + 1][j]);
        }
    }
 
    cout << result;
 
    return 0;
}
 
cs
반응형

'BOJ' 카테고리의 다른 글

백준 10448 - 유레카 이론  (0) 2019.05.14
백준 1463 - 1로 만들기  (0) 2019.05.12
백준 1912 - 연속합  (0) 2019.05.07
백준 1969 - DNA  (0) 2019.04.10
백준 2217 - 로프  (0) 2019.04.10