BOJ 3085 :: 사탕 게임
문제 링크 : https://www.acmicpc.net/problem/3085
나의 풀이
1. 주어진 행렬의 최대 수열을 먼저 찾는다.
2. 교환할 때마다, 교환한 행, 열에 한해 최대 수열을 찾는다.
3. 교환은 상하좌우 인접한 곳을 탐색하며, 배열 범위를 넘지 않고, 같은 색이 아니며, 방문했던 위치가 아닌 경우에만 가능하다.
4. 한 지점의 상하좌우 인접 위치를 교환하고 최대 수열을 구했다면 그 지점은 방문 표시한다.
나의 코드
Github : https://github.com/j2wooooo/Daliy_Algorithms/blob/master/Daliy_Algorithms/BOJ_3085/BOJ_3085.cpp
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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | // 백준알고리즘 3085번 :: 사탕 게임 #include<iostream> using namespace std; int N; char color[51][51]; int visited[51][51]; int answer = 1; int dx[4] = { -1, 1, 0, 0 }; int dy[4] = { 0, 0, -1, 1 }; void findmaxnum(int x, int y); // 교환 후, 가장 긴 수열 찾기 void swapping(int _x, int _y, int _mx, int _my) { int temp = color[_x][_y]; color[_x][_y] = color[_mx][_my]; color[_mx][_my] = temp; // 변화된 행과 열만 탐색 findmaxnum(_x, 0); findmaxnum(_y, 1); // 같은 행, 다른 열끼리 교환했다. if (_x == _mx) { findmaxnum(_my, 1); } // 같은 열, 다른 행끼리 교환했다. else { findmaxnum(_mx, 0); } temp = color[_x][_y]; color[_x][_y] = color[_mx][_my]; color[_mx][_my] = temp; return; } // 서로 다른 색을 가진 인접한 사탕 찾기 void findadjacent(int _x, int _y) { for (int i = 0; i < 4; i++) { int mx = _x + dx[i]; int my = _y + dy[i]; if (mx < 0 || mx >= N || my < 0 || my >= N) continue; if (visited[mx][my]) continue; if (color[_x][_y] == color[mx][my]) continue; swapping(_x, _y, mx, my); } return; } // x : 몇 행 또는 열인지, y : 0은 행, 1은 열 void findmaxnum(int x, int y) { if (y == 0) // x행에 대해서 탐색 { for (int i = 0; i < N-1; i++) { int cnt = 1; for (int j = i+1; j < N; j++) { if (color[x][i] == color[x][j]) { cnt++; } else break; } if (cnt > answer) answer = cnt; } } else // x열에 대해서 탐색 { for (int i = 0; i < N - 1; i++) { int cnt = 1; for (int j = i + 1; j < N; j++) { if (color[i][x] == color[j][x]) { cnt++; } else break; } if (cnt > answer) answer = cnt; } } return; } int main() { cin >> N; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) cin >> color[i][j]; } // 처음에 ans구하기 // x : 몇 행 또는 열인지, y : 0은 행, 1은 열 for (int i = 0; i < N; i++) { findmaxnum(i, 0); findmaxnum(i, 1); } // 교환하고 교환한 행, 열만 탐색하기 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { findadjacent(i, j); visited[i][j] = 1; } } cout << answer; return 0; } | cs |
'Problem > Brute force' 카테고리의 다른 글
[C/C++] BOJ 1941 :: 소문난 칠공주 (0) | 2019.03.12 |
---|---|
[SW Expert Academy] 1767. 프로세서 연결하기 (1) | 2019.03.07 |
[C/C++] BOJ 3/2 코딩테스트 대비 모의고사 A번 - 계란으로 계란치기 (0) | 2019.03.02 |
[SW Expert Academy] 1211. Ladder2 (0) | 2019.02.26 |
[SW Expert Academy] 1209. Sum (0) | 2019.02.26 |