길민호(ethan.mino)
코딩수첩
길민호(ethan.mino)
전체 방문자
오늘
어제
  • 분류 전체보기 (215)
    • Computer Science (0)
    • Web (6)
      • CSS (0)
      • HTML (0)
    • Node.js (0)
    • Javascript (2)
    • Java (46)
      • Spring (27)
      • Jsp (0)
    • C\C++ (2)
    • Programming (0)
    • AI (0)
    • Database (7)
    • Git (5)
    • Algorithm (119)
      • Stack (0)
      • Queue (0)
      • Linked List (0)
      • Sort (0)
      • Simulation (27)
      • Recursion (0)
      • Backtracking (4)
      • Two Pointer (3)
      • Dynamic Programming (19)
      • Greedy (10)
      • Graph (3)
      • Dijkstra (1)
      • BFS\DFS (8)
      • Floyd (1)
      • MST (4)
      • Tree (4)
      • Binary Search (8)
      • Binary Search Tree (4)
    • IntelliJ (4)
    • Vscode (0)
    • Operating System (0)
    • 후기 (3)
    • 성장일지 (13)
    • 스터디 (7)
    • 설치 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅡ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
길민호(ethan.mino)

코딩수첩

Algorithm/Simulation

[SW Expert Academy 13732번] 정사각형 판정 (C++)

2022. 5. 17. 14:22

문제

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


정사각형 판정 문제는 x의 최솟값/최댓값, y의 최솟값/최댓값을 찾아 해결할 수 있습니다. 

 

x, y의 최소/최댓값을 찾은 이후에는, 가로/세로 길이가 동일한지 확인하고, 정사각형의 내부가 막혀있는 격자로 채워져있는지 확인하면 됩니다. 

 

아래는 전체 코드입니다.

#include <bits/stdc++.h>
using namespace std;

#define x first
#define y second

char board[30][30];

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

    int t, i = 1; cin >> t;
    while(t--){
        int n; cin >> n;
        fill(&board[0][0], &board[29][30], 0);

        string str;
        for(int i = 0; i < n; i++){ // 격자 입력 받음
            cin >> str;
            for(int j = 0; j < str.size(); j++)
                board[i][j] = str[j];   
        }

        int pos[4] = {n + 1, n + 1, -1, -1};    // x의 최소 좌표, y의 최소 좌표, x의 최대 좌표, y의 최대 좌표

        for(int i = 0; i < n; i++){ 
            for(int j = 0; j < n; j++){     // x의 최소/최대 좌표, y의 최소/최대 좌표를 갱신함
                if(board[i][j] == '#'){ // 막혀있는 격자인 경우
                    pos[0] = min(pos[0], i);    // x의 최소 좌표
                    pos[1] = min(pos[1], j);    // y의 최소 좌표
                    pos[2] = max(pos[2], i);    // x의 최대 좌표
                    pos[3] = max(pos[3], j);    // y의 최대 좌표
                }
            }
        }

        bool square = true; // 격자판의 막혀있는 칸들이 하나의 정사각형을 이루는지 나타내는 flag 변수

        if(pos[2] - pos[0] != pos[3] - pos[1]) square = false;  // 가로, 세로 길이가 동일한지 확인
        for(int i = pos[0]; i <= pos[2]; i++){  // 정사각형의 내부가 막혀있는 격자로 채워져있는지 확인 
            for(int j = pos[1]; j <= pos[3]; j++)
                if(board[i][j] != '#') square = false;
        }

        cout << "#" << i++;
        if(square) cout << " yes"; else cout << " no";
        cout << "\n";
    }
}

'Algorithm > Simulation' 카테고리의 다른 글

[백준 17779번] 게리맨더링 2 (C/C++)  (0) 2022.03.31
[백준 4991번] 로봇 청소기 (C/C++)  (0) 2022.03.31
[백준 17144번] 미세먼지 안녕! (C/C++)  (0) 2022.03.30
[백준 17143번] 낚시왕 (C/C+)  (0) 2022.03.30
[백준 17140번] 이차원 배열과 연산 (C/C++)  (0) 2022.03.29
    'Algorithm/Simulation' 카테고리의 다른 글
    • [백준 17779번] 게리맨더링 2 (C/C++)
    • [백준 4991번] 로봇 청소기 (C/C++)
    • [백준 17144번] 미세먼지 안녕! (C/C++)
    • [백준 17143번] 낚시왕 (C/C+)
    길민호(ethan.mino)
    길민호(ethan.mino)
    💻 호기심 많은 서버 개발자 길민호입니다.

    티스토리툴바