문제 출처 - Baekjoon Online Judge
문제는 여기
[문제]
봄이 오고 있다. 해는 높이 떠서 환하게 빛나고 있다. 사람들은 햇볕을 가리기 위해 블라인드를 내린다.
상근이는 이웃들이 무엇을 하는지를 염탐하고, 이것에 대해서 뒷담화를 하는 주부이다. 올해는 건너편 아파트에 사는 사람들이 블라인드를 얼마나 내리는지를 조사하려고 한다.
모든 창문은 4×4 그리드로 나타낼 수 있고, *를 이용해서 블라인드를 나타낸다. 상근이가 볼 수 있는 창문은 다음 5가지 상태 중 하나이다.
건너편 아파트의 한 층에는 N개의 창문이 있고, 총 M층 건물이다. 현재 건너편 아파트의 창문 상태가 주어졌을 때, 위의 5가지 상태가 각각 몇 번 나오는지 구하는 프로그램을 작성하시오.
[입력]
첫째 줄에 M과 N이 공백으로 구분해서 주어진다. (1 ≤ M, N ≤ 100)
다음 줄에는 현재 건너편 아파트의 상태가 주어진다. 모든 창문은 문제 설명에 나온 것 처럼 4*4 그리드로 주어진다. 또, 창문과 창문은 '#'를 이용해서 구분한다. 예제 입력 형식을 참고하면 좋다. 아파트의 정보는 5M+1줄, 각 줄은 5N+1개 글자로 이루어져 있다.
[출력]
출력은 총 5개 숫자이다. 문제 설명에 나온 순서대로 각 블라인드 타입이 몇 개 있는지를 출력한다. 숫자를 모두 합하면 M*N이 되어야 한다.
[풀이]
1. 값들을 입력받아 담아준다.
2. 블라인드가 몇 칸인지 세다가 창문이 끝나면 블라인드에 높이에 맞는 값을 증가시켜준다.
3. 결과를 출력한다.
[접근]
1. 한 창문에 달린 블라인드는 모두 똑같은 높이이므로 한 창문에 맞는 열의 * 개수를 세어 문제를 해결하면 되겠다고 생각하였다.
[코드]
import java.io.*;
import java.util.*;
public class Main {
static int n, m;
static char map[][];
static int ans[];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// 5 * n + 1칸이 세로, 5 * m + 1칸이 가로
n = Integer.parseInt(st.nextToken()) * 5 + 1;
m = Integer.parseInt(st.nextToken()) * 5 + 1;
ans = new int[5];
map = new char[n][m];
// 입력
for (int i = 0; i < n; i++) {
String str = br.readLine();
for (int j = 0; j < m; j++) {
map[i][j] = str.charAt(j);
}
}
// 창문의 가로 탐색
for (int i = 1; i < m; i += 5) {
int cnt = 0; // 블라인드 칸수
// 창문의 세로 탐색
for (int j = 1; j < n; j++) {
// 블라인드 벗어나면
if (j % 5 == 0) {
// 블라인드 칸수에 맞춰서 증가
ans[cnt]++;
cnt = 0; // 초기화
}
else {
// 블라인드가 몇칸인지 세기
if (map[j][i] == '*')
cnt++;
}
}
}
for (int i = 0; i < 5; i++) {
System.out.print(ans[i] + " ");
}
}
}
'문제 풀이 > Baekjoon' 카테고리의 다른 글
[백준] S1 14716번 현수막 (JAVA) (0) | 2022.06.29 |
---|---|
[백준] S5 2578번 빙고 (JAVA) (0) | 2022.06.28 |
[백준] S5 2161번 카드1 (JAVA) (0) | 2022.06.26 |
[백준] S1 2002번 추월 (JAVA) (0) | 2022.06.25 |
[백준] S2 21938번 영상처리 (JAVA) (0) | 2022.06.23 |