[백준/BOJ] 1236번 : 성지키기 (JAVA / 자바)
안녕하세요~ 코딩하는 코알못 코메인입니다.
https://www.acmicpc.net/problem/1236
1236번: 성 지키기
첫째 줄에 성의 세로 크기 N과 가로 크기 M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 성의 상태가 주어진다. 성의 상태는 .은 빈칸, X는 경비원이 있는 칸이다
www.acmicpc.net
- 문제 -
난이도 브론즈 1 문제이다.
자바에서 입력방식은 scanner와 bufferedreader가 있다.
자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.
bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.
더 자세한 내용은 아래 글 참고 하면 좋다.
(JAVA / 자바) Scanner 와 Bufferedreader
안녕하세요~ 코딩하는 코알못 코메인입니다. 이번엔 백준 문제 풀면서 계속 언급될 scanner와 bufferedreader에 대한 간단한 정리를 해볼거다. 자바에서 입력은 scanner와 bufferedreader가 있다. 우선 각자
comain.tistory.com
풀이 방법
여기서 말하는 최솟값이란 제일 적은 경비병만 세워서 행과 열에 하나라도 막히게 최적화 되게 세우라는 것이다. 그 말은 행과 열중 경비병이 하나도 안서있는 라인을 뽑아서 행과 열 둘 중 한 곳에만 한 라인에 한명 씩 세워서 메꾸라는 것이다. 그렇다고 행과 열 나온 값중 작은 수를 고르거나 행과 열 둘중 한 곳만 구하고 그걸로 출력하면 당연 틀리게 된다. 비어있는 행이 5개 비어있는 열이 5개이면 같기때분에 5명만 세우면 빈 라인이 없게 세울 수 있다. 다른 예로 행 3줄 열 5줄이 비어 있는데 행만 보고 3명으로 출력하면 3줄은 메꿔도 2줄은 메꿔지지 않는다. 그렇기 때문에 둘중 큰 값을 가진 쪽을 출력하면 최소한의 경비병으로 메꿀 수 있는 것이다.
코드로 보자.
-풀이-
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());
//비어있는 라인의 수를 저장 할 변수
int count = 0;
//열을 계산하기 위해 입력값을 배열에 저장
String[] arr = new String[N];
for(int i = 0; i < N; i++) {
arr[i] = br.readLine();
//문자열에 X(경비병)의 포함 여부를 확인. false시 없다는 것
if(arr[i].contains("X") == false) {
count++;
}
}
//max 변수에 count 저장 후 count 초기화
int max = count;
count = 0;
//열의 빈 라인을 계산하기 위한 반복문
for(int i = 0; i < M; i++) {
//count하나로 비교까지 하기 부족하기에 같은 역활을 하나 더 선언
int counts = 0;
for(int j = 0; j < N; j++) {
if(arr[j].charAt(i) == '.') {
counts++;
}
}
//열에 .만 있는지 판별하는 조건문
if(counts == N) count++;
}
//행과 열 중 큰 값을 저장
max = Math.max(max, count);
System.out.println(max);
}
}
-결과-
아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.