백준 온라인 저지(BOJ) 3085번 - 사탕 게임
경우의 수
- NxN 크기의 테이블에 사탕이 있다 (N < 50)
- 인접한 두 칸을 고르고, 사탕을 교환한다 -> (N^2) * 2 의 경우의 수 (정확히는 (N-1)^2 * 2)
- 처음 고른 칸의 오른쪽, 아래쪽을 인접한 칸이라고 가정
- 같은 색으로 이루어져 있는 가장 긴 연속 부분 행 또는 열을 고름 -> O(N^2)
해답
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int check(vector<string> &a){
int n = a.size();
int ans = 1;
for(int i=0; i<n; i++){
int cnt = 1;
for(int j=1; j<n; j++){
if(a[i][j] == a[i][j-1])
cnt += 1;
else
cnt = 1;
if(ans < cnt)
ans = cnt;
}
cnt = 1;
for(int j=1; j<n; j++){
if(a[j][i] == a[j-1][i])
cnt += 1;
else
cnt = 1;
if(ans < cnt)
ans = cnt;
}
}
return ans;
}
int main() {
int n;
cin >> n;
vector<string> a(n);
for(int i=0; i<n; i++){
cin >> a[i];
}
int ans = 0;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(j+1 < n){
swap(a[i][j], a[i][j+1]);
int temp = check(a);
if(ans < temp)
ans = temp;
swap(a[i][j], a[i][j+1]);
}
if(i+1 < n){
swap(a[i][j], a[i+1][j]);
int temp = check(a);
if(ans < temp)
ans = temp;
swap(a[i][j], a[i+1][j]);
}
}
}
cout << ans << '\n';
return 0;
}
-
2번까지의 과정이 swap 함수까지이다. (STL 기본 함수)
-
swap은 오른쪽 값과 교환 / 아래 값과 교환으로 나누어서 진행한다.
-
3번을 수행하기 위해 check 함수로 들어간다.
-
check 함수에서 각 행/열에 대해 연속된 최대 길이를 계산한다.
-
계산 결과를 temp로 받아 최대 값일 경우 ans를 갱신한다.
'프로그래머 > 기타' 카테고리의 다른 글
[Git] cheat sheet 모음 | git 명령어 정리 (0) | 2021.04.11 |
---|---|
오늘의 복습 | C++ 11 | lambda function | binary tree | linked list (0) | 2020.11.17 |
[수강 후기] 패캠 딥러닝/인공지능 올인원 패키지 | 속지마세요 | 패스트캠퍼스 온라인 강의 (6) | 2020.05.17 |
백준 온라인 저지(BOJ) 2309번 - 일곱난쟁이 (0) | 2020.05.10 |
백준 <알고리즘 기초 1/2> 강의 후기 (2) | 2020.02.01 |