[BaekJoon] 1236. # 성 지키기

1 minute read

[BaekJoon] 1236. # 성 지키기

Question

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

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

입력

첫째 줄에 오늘 하루 동안 팔린 책의 개수 N이 주어진다. 이 값은 1,000보다 작거나 같은 자연수이다. 둘째부터 N개의 줄에 책의 제목이 입력으로 들어온다. 책의 제목의 길이는 50보다 작거나 같고, 알파벳 소문자로만 이루어져 있다.

출력

첫째 줄에 가장 많이 팔린 책의 제목을 출력한다. 만약 가장 많이 팔린 책이 여러 개일 경우에는 사전 순으로 가장 앞서는 제목을 출력한다.

Solution

풀이

모든 행과 모든 열에 1명 이상의 경비원이 있어야 하므로 행을 기준으로 부족한 경비원 수(rowNeedProtected)와 열을 기준으로 부족한 경비원 수(colNeedProtected)를 구해서 그 중 최대 수만큼 경비원을 배치하면 된다.

소스코드

import java.util.Scanner; 
import java.util.Arrays;  

public class Main { 
    public static void main(String[] args) throws Exception { 
        Scanner scn = new Scanner(System.in);
        int N = scn.nextInt(); // 세로
        int M = scn.nextInt(); // 가로
        
        char[][] castle = new char[N][M]; 
        for (int i = 0; i < N; i++)
        {
            String lineText = scn.next();
            castle[i] = lineText.toCharArray();
        }
        
        int[] rowProtected = new int[N];
        int[] colProtected = new int[M];
        // 경비원 존재여부 검증  
        for (int i = 0; i < N; i ++)
        {
            for (int j = 0; j < M; j ++) 
            {
                if (castle[i][j] == 'X')
                {
                    rowProtected[i] = 1;
                    colProtected[j] = 1;
                }
            }
        }
        
        int rowNeedProtected = (int)Arrays.stream(rowProtected).filter(n -> n == 0).count();
        int colNeedProtected = (int)Arrays.stream(colProtected).filter(n -> n == 0).count();
        
        System.out.println(Math.max(rowNeedProtected, colNeedProtected));
    } 
}

Learning…

Reference

Categories:

Updated:

Comments