juuuding

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

알고리즘/백준 문제 풀이

[백준] #1236 성 지키기

jiuuu 2023. 3. 17. 19:32

 문제

 

[문제 링크]

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

 

1236번: 성 지키기

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

www.acmicpc.net

 

[문제]

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

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

 

[입력]

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

 

[출력]

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

 

[예제 입출력]

[예제 입력 1 복사]

4 4
....
....
....
....

[예제 출력 1 복사]

4

 

[예제 입력 2 복사]

3 5
XX...
.XX..
...XX

[예제 출력 2 복사]

0

 

[예제 입력 3 복사]

5 8
....XXXX
........
XX.X.XX.
........
........

[예제 출력 3 복사]

3

 

 

 풀이 방법

 

[변수]

guard: 경비원 수

nec1: 각 행에 필요한 경비원 수

nec2: 각 열에 필요한 경비원 수

realnec: 실제 필요한 경비원 수

x, y: 열, 행

arr: 성의 크기 (배열)

 

[풀이]

Step1. 열과 행을 입력 받고 arr 배열에 삽입하여 성의 크기를 지정한다.

Step2. 경비원의 위치를 알 수 있는 문자열 s를 입력 받고, tocharArray를 이용하여 각 i(열)마다 y(행)크기 만큼 문자를 나눠서 경비원의 위치를 나타낸다.

Step3. 이중 반복문을 사용하여 각 행에 경비원이 있는지 확인하고 없다면 nec1을 1씩 증가시킨다.

Step4. 마찬가지로 이중 반복문을 사용하여 각 열에 경비원이 있는지 확인하고 없다면 nec2를 1씩 증가시킨다.

Step5. 열에 필요한 guard의 수와 행에 필요한 guard의 수를 비교하여 더 큰 것을 선택하여 출력한다.

 

 

[+]

String.toCharArray()

- 문자열을 한 글자씩 쪼개서 이를 char 타입의 배열에 집어 넣어주는 메소드

String s1 = "hello";
char[] charArr = s1.toCharArray();	//charArr 배열에 문자 하나씩 저장

 여기에 추가로 char형 배열을 합쳐서 다시 하나의 문자열을 만들 수 있다.

String s2 = new String(charArr);

 

 

 

 작성 코드

 

import java.util.Scanner;

public class CastleGuard {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        int i, j;
        int guard=0, nec1=0, nec2=0; //nec1: 행에 필요한, nec2: 열에 필요한 guard 수
        int realnec; //실제 필요한 guard
        int x= sc.nextInt(); //열
        int y= sc.nextInt(); //행
        char arr[][]= new char [x][y];

//guard 위치 배열로 저장
        for(i=0;i<x;i++) {
            String s =sc.next();
            arr[i]=s.toCharArray();
        }

//각 행에서 guard가 없다면 행에 필요한 guard 수(nec1) 증가
        for(i=0;i<x;i++) {
            for(j=0;j<y;j++) {
                if(arr[i][j]!='.') guard++;
            }
            if(guard==0) nec1++;
            guard=0;
        }

//각 열에서 guard가 없다면 열에 필요한 guard 수(nec2) 증가
        for(j=0;j<y;j++) {
            for(i=0;i<x;i++) {
                if(arr[i][j]!='.')guard++;
            }
            if(guard==0) nec2++;
            guard=0;
        }

//행에 필요한 guard 수와 열에 필요한 guard 수 비교해서 큰 것 선택
        if(nec1>nec2) realnec=nec1;
        else realnec=nec2;

        System.out.println(realnec);
    }

}

'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글

[백준] #1427 소트인사이드  (0) 2023.03.25
[백준] #1026 보물  (0) 2023.03.22
[백준] #2564 경비원  (0) 2023.03.19
[백준] #2164 카드2  (0) 2023.03.18
[백준] #1267 휴대폰 요금  (0) 2023.03.17