나 JAVA 봐라

[백준] 1236번 성지키기 본문

코딩테스트/구현

[백준] 1236번 성지키기

cool_code 2024. 3. 28. 19:31
  • 보통 input에는 공백(" ")으로 구분되어 입력이 들어오는데, 이번에는 공백 없이 들어옴. 
    • .split("")으로 처리하거나, charAt으로 끊어서 처리하는 방법이 있다.
  • 경비원을 가장 적게 배치하려면, 경비원이 필요한 가로-세로가 겹쳐지는 부분에 경비원을 두면 된다. 따라서 경비원이 필요한 행, 열의 갯수를 구한다.
    • 만약 경비원이 필요한 행,열이 모두 0이면? -> 추가로 필요한 경비원 없으니까 0 return
    • 행, 열 중 하나라도 경비원이 필요하면? -> 행, 열 중 더 큰 수 return 
package yejin.song;

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

public class BOJ_성지키기 {
    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 map[][] = new char[N][M];

        // 맵 초기화
        for(int i = 0; i< N; i++){
            //st = new StringTokenizer(br.readLine());
            String s = br.readLine();
            for (int j = 0; j <M; j++){
                map[i][j] = s.charAt(j);
            }
        }

        ArrayList<Integer> hang = new ArrayList<>();

        // 경비원 없는 행 찾기 (N 기준 탐색)
        for(int i =0; i< N; i++){
            for (int j=0; j<M; j++){
                if(map[i][j] == 'X'){ // 경비원이 있다면
                    break;
                }
                if (j == M-1){ //끝까지 다 돌았는데 경비원 없으면
                    hang.add(i); //몇번째 행인지 add
                }
            }
        }

        ArrayList<Integer> yul = new ArrayList<>();

        // 경비원 없는 열 찾기
        for(int i =0; i< M; i++){
            for (int j=0; j<N; j++){
                if(map[j][i] == 'X'){ // 경비원이 있다면
                    break;
                }
                if (j == N-1){ //끝까지 다 돌았는데 경비원 없으면
                    yul.add(i); //몇번째 열인지 add
                }
            }
        }


        int hang_size = hang.size();
        int yul_size = yul.size();

        // 만약 행,열 둘다 empty라면 -> 0
        if (hang_size == 0 && yul_size == 0){
            System.out.println(0);
            return;
        } else { // 하나라도 있다면-> 행, 열 중 더 큰 수 return
            System.out.println(Math.max(hang_size,yul_size));
            return;
        }

    }
}