계속지나가기
코딩스뮤
계속지나가기
전체 방문자
오늘
어제
  • 코딩스뮤:)
    • Algorithm
      • 백준 문제풀이
      • 프로그래머스 문제풀이
      • 알고리즘 이론
      • 자료구조
      • SW Expert Academy
    • 인공지능(AI)
      • LLMs
      • 자연어처리(NLP)
      • 컴퓨터비전(CV)
      • 딥러닝(DL)
      • 머신러닝(ML)
      • 인공지능기초수학
      • 선형대수학
    • 컴퓨터 세팅
    • Computer Science
      • 유닉스프로그래밍
      • 프로그래밍언어론
      • 디자인패턴
      • 클린코드
      • SW 영어
      • 리눅스
      • 논리회로
    • Server
      • Docker

블로그 메뉴

  • 홈
  • Who Am I(CV)
  • 태그

공지사항

인기 글

태그

  • 기계학습
  • 알고리즘
  • 머신러닝
  • 최대유량
  • LM
  • 결정경계
  • 비지도학습
  • MaximumFlow
  • 비용함수
  • SIFT
  • 선형회귀
  • ComputerVision
  • 파이썬 클린코드
  • networkflow
  • 디지털이미지처리
  • ML
  • 군집화
  • NLP
  • 경사하강법
  • 손실함수
  • f1-score
  • machinelearning
  • 네트워크플로우
  • DIP
  • 컴퓨터비전
  • 지도학습
  • 언어모델
  • 패턴인식
  • 에지검출
  • DigitalImageProcessing

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
계속지나가기

코딩스뮤

[C++] BOJ 1051. 숫자 정사각형
Algorithm/백준 문제풀이

[C++] BOJ 1051. 숫자 정사각형

2020. 9. 30. 17:15
반응형

www.acmicpc.net/problem/1051

 

1051번: 숫자 정사각형

N*M크기의 직사각형이 있다. 각 칸은 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행 또는

www.acmicpc.net

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;
int n,m;
int rec[51][51];
vector<int> square;
vector<int> column;
vector<int> tmp_square;

int check_square(int start_row, int start_column);// 인덱스 별 가장 큰 정사각형 사이즈를 리턴해주는 함수

int main(void){
    string tmp;
    int temp;
    cin >> n >> m;
    // 예시 입력 받기
    for(int i = 0; i < n; i++){
        cin >> tmp;
        for(int j = 0; j < m; j++){
            rec[i][j] = tmp[j] - '0';
        }
    }
    // rect[0~n-2][0~m-2]를 모두 순회하여 
    // check_squre을 통해 각 인덱스 별 최대 정사각형 크기 구하기
    for(int i = 0; i < n-1; i++){
        for(int j = 0; j < m-1; j++){
            temp = check_square(i, j);
            if( temp == 0 )// 정사각형이 안될 경우 패스 
                continue;
            else// 정사각형이 될 경우 squre 벡터에 임시 저장
                square.push_back(temp);
        }
    }
    // 정사각형이 되지 않는다면 디폴트로 1 반환
    if( square.size() == 0)
        cout << 1 << '\n';
    // 저장해둔 사이즈 중 가장 큰 정사각형 사이즈 반환
    else
        cout << *max_element(square.begin(), square.end()) <<'\n';
    return 0;
            
}

int check_square(int r,int c){
    int edge = rec[r][c];
    int size, len;
    int idx = 0;
    int ans = 0;
    // rec[r][c] 과 같은 꼭짓점을 찾아 column 벡터에 저장
    for(int j = c+1; j < m; j++)
        if( edge == rec[r][j] )
            column.push_back(j);
    size = column.size();

    // rec[r][c] 과 같은 꼭짓점 수만큼 반복
    while(size--){
        len = column[idx++] - c; //edge-꼭짓점 인덱스 차이 구하기
        // 최대 인덱스를 벗어날 경우 정사각형 체크를 하지 않음
        if( r + len >= n || c + len >= m )
            continue;
        // 정사각형을 찾을 경우
        if( edge == rec[r + len][c] && edge == rec[r + len][c + len] )
            if( ans < len + 1)// 이전에 찾은 정사각형 크기보다 크면 갱신
                ans = len + 1;
    }
    column.clear(); // column을 전역변수로 선언하였으므로 함수 종료시마다 clear해주기
    return ans*ans; // 정사각형의 너비를 리턴해주어야 함.
}
반응형

'Algorithm > 백준 문제풀이' 카테고리의 다른 글

[Python] BOJ 9663. N-Queen  (1) 2022.03.20
[Python] BOJ 1300. k번째 수  (0) 2021.01.31
[C++] BOJ 4386. 별자리 만들기  (0) 2020.09.23
[C++] BOJ 7576. 토마토  (0) 2020.09.16
[Kotlin] BOJ 7785. 회사에 있는 사람  (0) 2020.01.07
    'Algorithm/백준 문제풀이' 카테고리의 다른 글
    • [Python] BOJ 9663. N-Queen
    • [Python] BOJ 1300. k번째 수
    • [C++] BOJ 4386. 별자리 만들기
    • [C++] BOJ 7576. 토마토
    계속지나가기
    계속지나가기
    NLP Engineer

    티스토리툴바