반응형
본 문제는 n * n 크기의 사탕 중에서 인접한 2개의 사탕을 서로 교환하여 행 또는 열 중 가장 긴 연속 부분을 고르는 문제다.
문제의 조건에 맞게 인접한 2개의 사탕을 고르고 서로 교환하고 가장 긴 연속 부분을 확인하고 다시 교환하는 방식으로 문제를 해결하였다.
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 | #include <iostream> #include <string> #include <algorithm> using namespace std; char map[55][55]; int di[] = {1, -1, 0, 0}; int dj[] = {0, 0, 1, -1}; int n; bool range(int x, int y) { if (x >= 0 && x < n && y >= 0 && y < n) return true; else return false; } int cal(int x, int y) { char chk = map[x][y]; int a = 0; for (int i = x; i >= 0; i--) { if (chk == map[i][y]) a += 1; else break; } for (int i = x+1; i < n; i++) { if (chk == map[i][y]) a += 1; else break; } int b = 0; for (int j = y; j >= 0; j--) { if (chk == map[x][j]) b += 1; else break; } for (int j = y+1; j < n; j++) { if (chk == map[x][j]) b += 1; else break; } if (a < b) return b; else return a; } int main() { cin >> n; for (int i = 0; i < n; i++) { string s; cin >> s; for (int j = 0; j < s.size(); j++) { map[i][j] = s[j]; } } int result = 0; // 사탕 하나 고르기 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { // 인접한 사탕 고르기 for (int k = 0; k < 4; k++) { int ni = i + di[k]; int nj = j + dj[k]; // 범위 확인 if (range(ni, nj)) { // 교환 swap(map[i][j], map[ni][nj]); // 가장 긴 연속 부분 확인 int tmp = cal(i, j); if (result < tmp) result = tmp; // 상태 복원 swap(map[i][j], map[ni][nj]); } } } } cout << result << "\n"; } | cs |
반응형
'백준' 카테고리의 다른 글
[백준 14225] 부분수열의 합, C++ (0) | 2020.09.27 |
---|---|
[백준 1759] 암호 만들기, C++ (0) | 2020.09.17 |
[백준 2309] 일곱 난쟁이, c++ (0) | 2020.09.08 |
[백준 2668] 숫자고르기, c++ (0) | 2020.07.26 |
[백준 15685] 드래곤 커브, C++ (0) | 2020.05.16 |
댓글