-
백준 3085 - 사탕 게임백준 algorithm 2020. 5. 31. 23:50반응형
-> 오랜만에 푸는 알고리즘 문제입니다.
-> 그동안 스프링 공부하느라 포스팅을 못했습니다.......
=> 브루트 포스를 통해 풀어야 하는 문제입니다.=> BFS DFS로 접근을 하려했지만 도저히 생각이 안 납니다.
-
배열의 오른쪽과 바꾸는 것과 배열의 아래쪽과 바꾸는 것 두 가지의 경우를 생각해야 합니다.
-
바꾼 다음에 check라는 함수를 만들어 위아래로 했을 때 길게 나오는 배열의 수와 옆으로 했을 때 길게 나오는 배열의 수를 확인해야 합니다.
-
위의 두 가지의 경우를 확인하고 각자 나온 결과값 중 가장 긴 값을 출력합니다.
-
배열의 길이보다 긴 최댓값은 없으므로, 배열의 길이만큼의 값이 나온다면 도중에 멈출 수 있습니다.
// // main.cpp // Baekjoon // // Created by 이준후 // Copyright © 2020 이준후. All rights reserved. // #include <iostream> #include <algorithm> #include <string> using namespace std; int check(string Candy[], int size) { int ans = 1; for(int i=0; i<size; i++) { int tmp = 1; for(int j=1; j<size; j++) //오른쪽으로 가는 경우 { if( Candy[i][j] == Candy[i][j-1]) // 연속된다면 { tmp++; } else { tmp =1; } if(ans < tmp) ans = tmp; } tmp = 1;//다시 셀거므로 reset for(int j=1; j<size; j++) //오른쪽으로 가는 경우 { if( Candy[j][i] == Candy[j-1][i]) // 연속된다면 { tmp++; } else { tmp =1; } if(ans < tmp) ans = tmp; } } return ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int N; cin >> N; string Candy[50]; int high=0; for(int i=0; i<N; i++) { cin >> Candy[i]; } for(int i=0; i<N; i++) { for(int j=0; j<N; j++) { if((j+1) <N) // 오른쪽 부분과 바꾸는 경우 { swap(Candy[i][j],Candy[i][j+1]); int tmp = check(Candy, N); high = max(high, tmp); swap(Candy[i][j],Candy[i][j+1]); //원상복구 } if( (i+1) < N) { swap(Candy[i][j],Candy[i+1][j]); int tmp = check(Candy, N); high = max(high, tmp); swap(Candy[i][j],Candy[i+1][j]); } } if( high == N) break; } cout << high <<'\n'; return 0; }
***처음에는 char형 이중 배열로 받을 생각을 하였습니다. 그런 식으로 접근하는 것보다 string의 배열 형식으로 접근하면 자동으로 2차원 배열 형식임을 해당 문제의 다른 포스팅을 보고 알게 되었습니다.
반응형'백준 algorithm' 카테고리의 다른 글
백준 1107 - 리모컨 (0) 2020.06.02 백준 1476 - 날짜 계산 (0) 2020.06.01 백준 2309 - 일곱난쟁이 (0) 2020.05.16 백준 11053 - 가장 긴 증가하는 부분 수열 (0) 2020.05.09 백준 2193 - 이친수 (0) 2020.04.23 -