본문 바로가기

백준/C++

[Baekjoon/C++] 성 지키기 1236번

Baekjoon Online Judge

문제로 이동

 

문제

영식이는 직사각형 모양의 성을 가지고 있다. 성의 1층은 몇 명의 경비원에 의해서 보호되고 있다. 영식이는 모든 행과 모든 열에 한 명 이상의 경비원이 있으면 좋겠다고 생각했다.

성의 크기와 경비원이 어디있는지 주어졌을 때, 몇 명의 경비원을 최소로 추가해야 영식이를 만족시키는지 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 성의 세로 크기 N과 가로 크기 M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 성의 상태가 주어진다. 성의 상태는 .은 빈칸, X는 경비원이 있는 칸이다.

 

출력

첫째 줄에 추가해야 하는 경비원의 최솟값을 출력한다.

 


예제 입력 예제 출력
4 4
....
....
....
....
4
3 5
XX...
.XX..
...XX
0
5 8
....XXXX
........
XX.X.XX.
........
........
3

풀이

#include <iostream>
using namespace std;

int main() {
    bool sero[51] = { false };
    bool garo[51] = { false };

    // 세로 크기 N, 가로 크기 M
    int N, M;
    cin >> N >> M;

    for (int i = 0; i < N; i++) {
        string s;
        cin >> s;

        // 경비원이 있는 칸 체크
        for (int j = 0; j < M; j++) {
            if (s[j] == 'X') {
                sero[i] = true;
                garo[j] = true;
            }
        }
    }

    // 추가해야 하는 경비원의 최솟값 찾기
    int count1 = N;
    for (int i = 0; i < N; i++)
        if (sero[i] == true) count1--;

    int count2 = M;
    for (int i = 0; i < M; i++)
        if (garo[i] == true) count2--;

    // 출력
    if (count1 > count2)
        cout << count1;
    else
        cout << count2;

    return 0;
}

세로와 가로의 최대 길이 51를 이용해서 배열을 2개 만든 뒤 fasle로 초기화했다.

string으로 한 줄씩 입력 받은 뒤 for문으로 X을 찾을 때마다 X의 좌표에 해당되는 위의 두 배열의 값을 true로 바꿨다.

그 뒤 두 배열의 fasle 수를 센 뒤 더 큰 수를 출력했다.