[BOJ] 백준 #1051. 숫자 정사각형 (C++)

1 분 소요

🎨 문제

boj-1051

문제 링크: https://www.acmicpc.net/problem/1051

  • 알고리즘 분류: 구현, 브루트 포스
  • 난이도: Silver Ⅲ



💬 풀이

또 은근 구현이 까다로웠던 문제

  1. 한 글자씩 입력받는 거 ― scanf() 사용
    처음에 생각없이 cin으로 받다가 하다가 한줄이 통째로 입력됐었다.
    참고로 cin은 공백이나 개행 입력 시 그 이전까지 받음
  2. 닥치고 이중for문 돌리기
    👉🏻 N==1 or M==1이면 그냥 1. 끝.
    👉🏻 arr[i][j]가 ‘정사각형의 왼쪽 위 꼭짓점’이라 생각하고 탐색 시작
    👉🏻 가장 큰 걸 구하는 거니까 1부터 X. 큰 것부터 ㅇㅇ. for (int k = min(N-i-1, M-j-1); k>0; k--)
    👉🏻 if (k < l) break; : 예를 들어 l=3인데 탐색 남은 줄이 2줄 밖에 없다면 할 필요 없음.



‘문자열 입력받는 여러 가지 방법 총정리’를 해야겠다. (언젠가)
입력 방법에 대해 매번 정확하게 알고 있는 것 같지 않으니 그때그때 정리할 필요가 있겠다.



👩‍💻 코드

C++

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cmath>
using namespace std;

int main() {
	//freopen("input.txt", "rt", stdin);
	int N, M;
	cin >> N >> M;
	int** arr = new int* [N];
	for (int i = 0; i < N; i++) {
		arr[i] = new int[M];
	}
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			scanf("%1d", &arr[i][j]);
		}
	}

	// arr[i][j]가 정사각형 왼쪽 위 꼭짓점이라고 치고 브루트포스
	int l = 1;
	if (N == 1 || M == 1) {
		cout << 1;
		return 0;
	}
	else {
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				for (int k = min(N - i - 1, M - j -1); k > 0; k--) {
					if (k < l) break;
					if (arr[i][j] == arr[i][j + k]
						&& arr[i][j] == arr[i + k][j]
						&& arr[i][j] == arr[i + k][j + k]) {
						l = max(k + 1, l);
						break;
					}
				}
			}
		}
	}
	cout << l * l;

	return 0;
}


댓글남기기