| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- 자바 백준 1157
- html
- SVM어셈블러
- javascript
- 자바 한수
- 자바
- 백준 1157
- java
- 지도 구현
- 자바 백준 2751
- 백준 1236번
- 자바 백준 9012
- 백준 9012
- 백준 한수
- 자바 백준 단어공부
- 자바 백준 1236번
- 투패스 어셈블러
- java 성적산출프로그램
- 백준 1065번
- 어셈블러
- SVM 투패스 어셈블러
- java 백준
- CSS
- 자바 백준
- 카카오 맵 api
- 자바 성적산출프로그램
- 백준 2751
- 백준 2751 자바
- 한수구하기
- 자바 미니프로젝트
- Today
- Total
Sunny's Coding Diary
자바[JAVA] - 백준 1236번 성지키기 본문
프로젝트를 완성하고 다음 프로젝트를 만들기 전까지 백준을 풀며 실력향상을 하기로 했다.
그래서 찾은 문제가 1236번 성지키기 문제이다.

문제는 다음과 같다.

[문제]
성은 입력받은 행과 열로 구성되어 있고, 곧 성의 크기를 나타낸다. 성의 크기는 행, 열이 50보다 작거나 같은 자연수로 구성된다. 성의 상태는 기본값을 .으로 나타내고 해당 구역에 경비원이 있으면 X로 표시한다. 성의 경비원은 각 행과 열마다 최소 한 명 이상이 존재하여야 한다.
성의 크기와 성의 구조를 입력받고 성의 경비원들을 확인해 경비원을 추가 배치해야되는 최소의 경비원의 수를 구하는 것이 문제이다.
문제에 해당하는 소스코드는 다음과 같다.
[소스코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
//백준 성지키기
public class M1236 {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int n, m = 0;
int count1 = 0, count2 = 0;
int save = 0;
int result = 0;
String[] line = new String[50];
String[][] castle = new String[50][50];
//배열의 크기 설정
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
//입력받은 값 2차원 배열로 저장
for(int i=0; i<n; i++) {
String[] a = bf.readLine().split("");
for(int j=0; j< a.length; j++) {
castle[i][j] = a[j];
}
}
//배열 체크
for(int i = 0;i < n;i++) {
for(int j =0;j < m;j++) {
if(!(castle[i][j].equals("X"))) {
save++;
}
if(save == m) {
count1++;
}
}
save = 0;
}
//배열 체크
for(int j = 0;j < m;j++) {
for(int i = 0;i < n;i++) {
if(!(castle[i][j].equals("X"))) {
save++;
}
if(save == n) {
count2++;
}
}
save = 0;
}
if(count1 < count2) result = count2;
else result = count1;
System.out.print(result);
}
}
[해석]
1. 먼저 성의 크기를 나타내는 변수 n, m을 입력받는다. 두 수를 한줄에 입력받기 위해 토큰으로 분리하여 각 변수로 대입한다. 그리고 성의 구조를 배열로 저장하여 입력받는다.
2. 이때는 한줄을 읽어와 1차원 배열로 저장한다. 그 후 입력받은 성의 구조를 한 문자씩 나누어서 2차원 배열로 저장한다.
3. 성의 구조를 저장했다면 한 칸마다 경비원이 있는지 확인한다.
4. 그 다음으로 경비원을 확인하는 과정이다. n의 크기를 알고 있기 때문에 . 이 n과 동일하게 된다면 해당 줄에는 경비원이 없다는 것을 뜻한다. save변수를 통해 한 칸마다 경비원의 존재를 확인해 준다.
5. 확인했다면 save와 성의 크기인 n과 동일한지 확인해 주고 변수 count1에 저장해 준다. 저장 후에는 save를 0으로 초기화해준다. (이때 행과 열을 모두 확인해야 하기 때문에 count1과 count2로 나누어서 체크해 준다.)
6. 다 확인했다면 마지막으로 행으로 확인했을 때의 필요한 경비원수와 열로 확인했을때의 필요한 경비원수를 비교해 주고 기준점을 n으로 잡았기 때문에 count1이 count2보다 작은 경우만 계산해서 구하면 된다.
(그 이유는 n보다 m의 경비원이 적을 수 있는 경우를 예외로 잡고 문제를 풀었기 때문이다.)
7. 확인을 하고 count1보다 count2가 작이면 최종 경비원수를 나타내는 변수 result에 count2의 값을 저장하고 그렇지 않다면 result에 count1 값을 넣는다.
[해결]

[꿈은 크게 가져라, 부서져도 그 조각이 크게]
'JAVA' 카테고리의 다른 글
| 자바[JAVA] - 백준 2751번 수 정렬하기 (0) | 2023.02.26 |
|---|---|
| 자바[JAVA] - 백준 1157번 단어공부 (0) | 2023.02.25 |
| 자바[JAVA] - 백준 1065번 한수 (2) | 2023.02.04 |
| 자바[JAVA] - 성적산출프로그램(최종) (0) | 2023.01.13 |
| 자바[JAVA] - 성적산출프로그램 (3) | 2023.01.06 |