※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 6199번 문제인 Big Square이다.
문제는 아래 링크를 확인하자.

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

 

100행100열의 격자에서 정사각형이 되게끔 네 점을 고르는 경우의 수는 충분히 적다(1000만 이하)는 점을 관찰하자.

 

이 점을 이용하면 가능한 모든 정사각형 네 점의 위치에 한 번씩 접근하여 해당 정사각형을 이룰 수 있는지 확인 및 넓이 계산을 반복하는 완전탐색으로 가능한 정사각형의 넓이의 최댓값을 계산할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int N;
char board[100][100];
int ans;

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

    cin >> N;
    for (int r = 0; r < N; r++) {
        for (int c = 0; c < N; c++) {
            cin >> board[r][c];
        }
    }

    for (int dr = 0; dr < N; dr++) {
        for (int dc = 0; dr + dc < N; dc++) {
            for (int r = dc; r + dr < N; r++) {
                for (int c = 0; c + dr + dc < N; c++) {
                    int jcnt = 0, bcnt = 0, acnt = 0;
                    if (board[r][c] == 'J') jcnt++;
                    else if (board[r][c] == 'B') bcnt++;
                    else acnt++;
                    if (board[r + dr][c + dc] == 'J') jcnt++;
                    else if (board[r + dr][c + dc] == 'B') bcnt++;
                    else acnt++;
                    if (board[r + dr - dc][c + dc + dr] == 'J') jcnt++;
                    else if (board[r + dr - dc][c + dc + dr] == 'B') bcnt++;
                    else acnt++;
                    if (board[r - dc][c + dr] == 'J') jcnt++;
                    else if (board[r - dc][c + dr] == 'B') bcnt++;
                    else acnt++;

                    if (jcnt == 4 || (jcnt == 3 && acnt == 1)) ans = max(ans, (dr + dc) * (dr + dc) - 2 * dr * dc);
                }
            }
        }
    }
    cout << ans;
}

 

728x90

'BOJ' 카테고리의 다른 글

[BOJ 19686 // C++] Lost Array  (0) 2024.09.08
[BOJ 14488 // C++] 준오는 급식충이야!!  (1) 2024.09.07
[BOJ 7088 // C++] Word counting  (1) 2024.09.05
[BOJ 7804 // C++] Taxi!  (3) 2024.09.04
[BOJ 14265 // C++] 영선 수열  (3) 2024.09.03

+ Recent posts