본문으로 바로가기

3085 사탕 게임

category ps/브루트 포스 2021. 8. 21. 15:03

사탕게임 (3085)

 

풀이코드

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
// 3085 사탕 게임
const int MAX = 50;

int N;

int longestRowColumn(vector<string>& board){
	int max = -1;
	
	for(int i = 0; i < N; i++){
		int cnt = 1;
		for(int j = 1; j < N; j++){
			if(board[i][j] == board[i][j - 1]) cnt++;
			else {cnt = 1;}
			if(max < cnt) max = cnt;
		}
	}
	
	for(int i = 0; i < N; i++){
		int cnt = 1;
		for(int j = 1; j < N; j++){
			if(board[j][i] == board[j - 1][i]) cnt++;
			else {cnt = 1;}
			if(max < cnt) max = cnt;
		}
	}
	
	return max;
	
		
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr); 
	cout.tie(nullptr); 
	
	cin >> N;
	vector<string> board(N);

	for (int i = 0; i < N; i++) {
 		cin >> board[i];
 	}
	
	int ans = -1;
	
	// 교환
	for(int i = 0; i < N; i++)
		for(int j = 0; j < N; j++){
			// 범위 체크 (오른쪽 교환)
			if(j + 1 < N){
				swap(board[i][j], board[i][j+1]);
				int tmp = longestRowColumn(board);
				if(ans < tmp) ans = tmp;
				swap(board[i][j], board[i][j+1]);
			}
			// 범위 체크 (아래 교환)
			if(i + 1 < N){
				swap(board[i][j], board[i + 1][j]);
				int tmp = longestRowColumn(board);
				if(ans < tmp) ans = tmp;
				swap(board[i][j], board[i + 1][j]);
			}
		}
	
	cout << ans << '\n';
	
	return 0;
}

 

해설


적용한 레시피 / 방법론 + 접근법

1

풀이

1한 칸을 선택한뒤 바로 오른쪽, 아래 만 교환해보는 브루트 포스. 교환해주고 max 인지 체크해준뒤에 다시 원상태로 돌려두는 것이 가장 주요한 포인트였다.

아쉬웠던 부분 / 오답 원인 / 개선해야 할 점

- 문제 해석에 오류가 있었다. 문제는 ' 단 한 번 교환' 한 뒤에 바로 max 열 또는 행을 먹는 것이었는데, 처음 잘못 이해한 것은 무제한적으로 교환 한 뒤에 먹는 것이라 생각하여 논리 구현에 큰 어려움이 있었다.

- for 문의 범위를 잘못 설정하여 for 문안에 들어가야 할 조건문이 밖으로 나와있었다... 온전히 나의 것으로 작성하지 않아서 집중하지 않아 발생한 실수 같다.

- string 값을 갖는 1차원 vector 로 선언하여 처리한 것. char의 나열을 string 으로 인식하여 한번에 cin 한 것. 실제로 처리할 때는 char 값들로 했지만.. 그런 것들이 인상깊었다.

반응형

'ps > 브루트 포스' 카테고리의 다른 글

14500 테트로미노  (0) 2021.08.22
리모컨 1107  (0) 2021.08.22
2309 일곱 난쟁이  (0) 2021.08.21
11726  (0) 2021.07.10
1476  (0) 2021.07.10