suheang

[백준] | JAVA, 자바 | 1236번 - 성 지키기 본문

알고리즘

[백준] | JAVA, 자바 | 1236번 - 성 지키기

suheang 2024. 5. 28. 21:16

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


문제 요약 :

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

 

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

 

성의 상태는 .은 빈칸, X는 경비원이 있는 칸이다.


문제 풀이 :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        char[][] castle = new char[n][m];

        for (int i = 0; i < n; i++) {
            String s = br.readLine();
            for (int j = 0; j < s.length(); j++) {
                char c = s.charAt(j);
                castle[i][j] = c;
            }
        }

        int rowGuards = 0;
        int colGuards = 0;

        for (int i = 0; i < n; i++) {
            boolean hasGuard = false;
            for (int j = 0; j < m; j++) {
                if (castle[i][j] == 'X') {
                    hasGuard = true;
                    break;
                }
            }
            if (!hasGuard) {
                rowGuards++;
            }
        }

        for (int j = 0; j < m; j++) {
            boolean hasGuard = false;
            for (int i = 0; i < n; i++) {
                if (castle[i][j] == 'X') {
                    hasGuard = true;
                    break;
                }
            }
            if (!hasGuard) {
                colGuards++;
            }
        }

        System.out.println(Math.max(rowGuards, colGuards));
    }
}

 

1. 세로 크기 n, 가로 크기 m 입력받기

2. 2차원 배열 castle 생성

3. 성의 상태를 입력받고 2차원 배열 castle에 저장

4. 행과 열에 필요한 경비원의 수를 저장하기 위한 변수 rowGurads, colGurads 생성

5. 각 행에 경비원이 있는지 확인하기 위해 for 문 실행

5 - 1. 경비원이 있는지 확인하기 위한 boolean 변수 hasGuard 생성

5 - 2. 만약 castle[i][j]의 값이 X라면 hasGuard의 값을 true로 변경하고 for 문 종료
5 - 3. 만약 hasGuard의 값이 false라면 Gurad의 값 증가

6. 각 열에 경비원이 있는지 확인, 5번과 동일하지만 범위가 변경

7. 행에 필요한 경비원과 열에 필요한 경비원을 비교하고 그중 더 큰 값을 선택해서 출력