[BOJ] 백준 2799 - 블라인드 풀이
1. 문제
https://www.acmicpc.net/problem/2799
2799번: 블라인드
첫째 줄에 M과 N이 공백으로 구분해서 주어진다. (1 ≤ M, N ≤ 100) 다음 줄에는 현재 건너편 아파트의 상태가 주어진다. 모든 창문은 문제 설명에 나온 것 처럼 4*4 그리드로 주어진다. 또, 창문과
www.acmicpc.net
2. 풀이
백준 난이도 실버 4에 해당하는 문제이다.
우선 모든 창문은 4*4 그리드 형태로 이루어져있고 입력으로 주어지는 아파트 정보는 5M + 1줄, 5N + 1개의 글자로 이루어져 있으므로 5M + 1, 5N + 1로 2차원 배열을 만들고 아파트 정보를 초기화해준다.
그 후 창문을 하나씩 탐색하면서 창문의 형태를 파악해주면 되는데, 자세히 보면 규칙이 존재한다.
1. 첫 번째 층의 창문의 시작은 항상 (1, 1)에서 시작한다.
2. 같은 층의 다른 창문의 시작은 탐색했던 창문의 시작에서 x축으로(배열에서는 열의 값) 5만큼 떨어져있다.
3. 다른 층의 첫 번째 창문은 이전 층의 첫 번째 창문의 시작에서 y축으로 (배열에서는 행의 값) 5만큼 떨어져있다.
이 규칙을 토대로 반복문을 작성한다.
먼저 x값은 하나의 층이 시작될 때 초기화 되지 않고 값을 유지해야 하므로 while 반복문 (코드에서는 층을 루프하는 반복문) 밖에 존재하지만 y값은 값이 초기화 되므로 while 반복문 안에 존재한다.
while 안에서는 창문의 개수만큼 반복문을 도는데, 이때 '*'의 개수를 세고 4로 나누어 어떤 유형의 블라인드인지를 파악한다.
그 후 '*'의 개수를 4로 나눈 값을 인덱스로 하는 resultArr 배열의 위치에 +1을 해준다.
창문을 하나 반복했다면 규칙 2번에 의거하여 y인덱스를 +5를 하고, 창문을 한 번 반복했다면 규칙 3번에 의거하여 x인덱스를 +5 해준다.
마지막으로 결과 배열을 출력하면 정답!!
3. 소스 코드
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
int[] resultArr = new int[5];
char[][] map = new char[(5 * M) + 1][(5 * N) + 1];
for (int i = 0; i < (5 * M) + 1; i++) {
String s = br.readLine();
for (int j = 0; j < (5 * N) + 1; j++) {
map[i][j] = s.charAt(j);
}
}
int idx_x = 1;
while (M-- > 0) {
int idx_y = 1;
for (int i = 0; i < N; i++) {
int starCnt = 0;
for (int j = idx_x; j < idx_x + 4; j++) {
for (int k = idx_y; k < idx_y + 4; k++) {
if (map[j][k] == '*') {
starCnt += 1;
}
}
}
resultArr[starCnt / 4] += 1;
idx_y += 5;
}
idx_x += 5;
}
for (int i = 0; i < resultArr.length; i++) {
bw.write(Integer.toString(resultArr[i]) + " ");
}
bw.flush();
bw.close();
br.close();
}
}