본문 바로가기
📊알고리즘/BOJ

BOJ 1799 - 비숍 (🔄)

by meteorfish 2024. 2. 29.
728x90

https://www.acmicpc.net/problem/1799

 

1799번: 비숍

첫째 줄에 체스판의 크기가 주어진다. 체스판의 크기는 10이하의 자연수이다. 둘째 줄부터 아래의 예와 같이 체스판의 각 칸에 비숍을 놓을 수 있는지 없는지에 대한 정보가 체스판 한 줄 단위로

www.acmicpc.net

 

접근 방법

10초라고해서 기존 백트래킹을 이용했는데 10X10에선 시간초과가 났다.

 

비숍을 둘 수 있는 곳을 따로 저장하여 recursion 속 for문에서 사용하였는데 , 중복되는 부분이 많았다.

recursion을 비숍을 둘 수 있는 곳을 기준으로 도는 것이 아니라 x,y를 기준으로 돌면 좋겠다는 생각을 하루동안 하지 못했다...

따라서, 다른 블로그를 참고하였다.

 

문제의 핵심은 다음과 같다.

1. parameter에 row와 col을 사용하여 recursion을 한다.

2. 밑의 그림처럼 black과 white를 나눠서 계산하고, 두 개를 더한 값을 구한다.

출처: https://j2wooooo.tistory.com/80

 

2번을 유심히 생각해보자.

비숍의 경우 대각선으로만 서로 영향을 미치기 때문에, black과 white 간의 간섭은 발생할 수 없다.

만약 이를 고려하지 않고 진행하면 O(n^2)으로 브루트포스와 같은 실행시간이 소요된다.

 

그러나 color을 나눠서 계산하면 O(N/2 * N/2)로 Time Complexity가 확실히 감소하기에 시간초과를 벗어날 수 있다.

 

블로그 글쓰신 분들 대단하십니다...

 

코드

#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>

#define MAX 200

using namespace std;

int n;
bool chk1[MAX];
bool chk2[MAX]; 
int map[MAX][MAX];
int res[2];

// 비숍을 둘 수 있는 칸의 남은 개수
void func(int row, int col, int bishop, int color) {
	//cout << "cnt: " << cnt << endl;
	if (col >= n) {
		row++;
		if (col % 2 == 0)	col = 1;
		else	col = 0;
	}
	if (row >= n) {
		res[color] = max(res[color], bishop);
		return;
	}

	// 둘 수 없으면 패스
	if (!map[row][col] || chk1[row + col] || chk2[row - col + n - 1]) {
		func(row, col + 2, bishop, color);
	}
	else {
		chk1[row + col] = true;
		chk2[row - col + n - 1] = true;
		func(row, col + 2, bishop + 1, color);
		chk1[row + col] = false;
		chk2[row - col + n - 1] = false;

		func(row, col + 2, bishop, color);
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> map[i][j];
		}
	}
	
	func(0, 0, 0, 0);
	func(0, 1, 0, 1);
	cout << res[0] + res[1];
}

 

728x90

'📊알고리즘 > BOJ' 카테고리의 다른 글

BOJ 14502 - 연구소  (0) 2024.03.12
BOJ 2206 - 벽 부수고 이동하기  (0) 2024.03.05
BOJ 16987 - 계란으로 계란치기  (0) 2024.02.28
[그리디 #21] BOJ 7570 - 줄 세우기  (0) 2024.02.27
[그리디 #20] BOJ 2212 - 센서  (0) 2024.02.25