백준 1236 성 지키기 JAVA 풀이 (구현, 그리디)

2026. 4. 6. 17:12·코테(Solved.ac + Programmers)
728x90

🔗 문제 링크

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


📌 문제 개요

N x M 크기의 성이 주어진다.
각 칸에는:

  • 'X' : 경비원이 있음
  • '.' : 경비원이 없음

조건:

  • 모든 행과 모든 열에는 최소 1명의 경비원이 있어야 한다
  • 추가로 배치해야 하는 최소 경비원 수를 구하는 문제

📌 접근 방법

이 문제는 단순 구현 + 아이디어 문제

  1. 전체 맵을 저장
  2. 각 행을 순회하면서
    • 경비원이 없는 행 개수 체크
  3. 각 열을 순회하면서
    • 경비원이 없는 열 개수 체크
  4. 두 값 중 큰 값을 출력

📌 핵심 아이디어

핵심은 이 한 줄이다 

  • 결과 = max(경비원 없는 행 수, 경비원 없는 열 수)

 

왜 max를 쓰는가?

경비원 1명은 한 위치에 배치되면 행 + 열을 동시에 커버 가능

 

즉,

  • 행이 부족한 수: 3
  • 열이 부족한 수: 2

최소 배치 수는 3

 

왜냐하면:

  • 더 부족한 쪽을 기준으로 채워야
  • 모든 조건을 만족할 수 있기 때문

 

예시

.X.
...
..X

 

행 기준

  • 0번 행 → 있음
  • 1번 행 → 없음
  • 2번 행 → 있음

rowCount = 1

 

열 기준

  • 0번 열 → 없음
  • 1번 열 → 있음
  • 2번 열 → 있음

colCount = 1

 

결과: max(1, 1) = 1

 

📌 전체 코드

package no_1236;

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

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

        String[] input = br.readLine().split(" ");
        int N = Integer.parseInt(input[0]);
        int M = Integer.parseInt(input[1]);

        char[][] map = new char[N][M];

        for (int i = 0; i < N; i++) {
            map[i] = br.readLine().toCharArray();
        }

        int rowCount = 0;
        int colCount = 0;

        // 행 검사
        for (int i = 0; i < N; i++) {
            boolean hasGuard = false;
            for (int j = 0; j < M; j++) {
                if (map[i][j] == 'X') {
                    hasGuard = true;
                    break;
                }
            }
            if (!hasGuard) rowCount++;
        }

        // 열 검사
        for (int j = 0; j < M; j++) {
            boolean hasGuard = false;
            for (int i = 0; i < N; i++) {
                if (map[i][j] == 'X') {
                    hasGuard = true;
                    break;
                }
            }
            if (!hasGuard) colCount++;
        }

        System.out.println(Math.max(rowCount, colCount));
    }
}

📄 정리

  • 행과 열을 각각 따로 검사하는 문제
  • 핵심은 “동시에 커버 가능”이라는 점
728x90

'코테(Solved.ac + Programmers)' 카테고리의 다른 글

백준 13301 타일 장식물 JAVA 풀이 (피보나치, DP)  (0) 2026.04.08
백준 1769 3의 배수 JAVA 풀이 (문자열, 구현, 수학)  (0) 2026.04.07
백준 5800 성적 통계 JAVA 풀이 (정렬, 구현)  (0) 2026.04.06
백준 2828 사과 담기 게임 JAVA 풀이 (그리디, 구현)  (0) 2026.04.04
백준 16435 스네이크버드 JAVA 풀이 (그리디, 정렬)  (0) 2026.04.03
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
  • 백준 13301 타일 장식물 JAVA 풀이 (피보나치, DP)
  • 백준 1769 3의 배수 JAVA 풀이 (문자열, 구현, 수학)
  • 백준 5800 성적 통계 JAVA 풀이 (정렬, 구현)
  • 백준 2828 사과 담기 게임 JAVA 풀이 (그리디, 구현)
PUSH → MERGE → DEPLOY
PUSH → MERGE → DEPLOY
데이터 흐름과 운영 자동화를 설계하는 백엔드 개발자
  • PUSH → MERGE → DEPLOY
    Coding Dongin
    PUSH → MERGE → DEPLOY
  • 전체
    오늘
    어제
    • MEUN
      • 코테(Solved.ac + Programmers)
      • BootCamp(JAVA)
      • JAVA
      • SpringBoot
      • JavaScript
      • JSP
      • DB(SQL)
      • React
      • HTML_CSS
      • jQuery
      • SCSS
      • GSAP
      • 설치 + 꿀팁
      • 정보처리기사 오답노트
      • 정보처리기사 기출문제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GIT
  • 공지사항

  • 인기 글

  • 태그

    완전탐색
    코딩테스트
    자바
    dp
    알고리즘
    백엔드개발자
    수학
    자료구조
    배열
    정렬
    정처기실기
    level0
    백준
    정보처리기사 실기 기출문제
    정처기
    브루트포스
    정보처리기사
    구현
    solved.ac
    java
    springboot
    시뮬레이션
    기출문제
    문자열
    level1
    실기
    정처기오답노트
    Level2
    프로그래머스
    피보나치
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.4
PUSH → MERGE → DEPLOY
백준 1236 성 지키기 JAVA 풀이 (구현, 그리디)
상단으로

티스토리툴바