[백준] 14671번 - 영정이의 청소 (Silver 1)
업데이트:
문제 링크
백준 14671번 - 영정이의 청소 (Silver 1)
문제 설명
N x M 크기의 바닥에 곰팡이가 있다.
이 곰팡이는 대각선 위 아래로 증식하며, 증식한 다음 원래 곰팡이가 있던 자리는 곰팡이가 사라진다.
단, 곰팡이가 사라지는 지점이자 증식되는 지점의 곰팡이는 증식된다.
곰팡이가 바닥 전체를 뒤덮는 시점이 생긴다면 YES를, 아니면 NO를 출력하시오.
정답 코드 및 설명
(i, j) 지점에 있는 곰팡이는 2번 증식 후에는 (i - 2, j - 2), (i - 2, j), (i - 2, j + 2), (i, j - 2), (i, j), (i, j + 2), (i + 2, j - 2), (i + 2, j), (i + 2, j + 2)로 퍼지게 된다.
이를 다시 정리하면, (i, j) 지점에 있는 곰팡이는 충분히 큰 짝수번 증식 후에는 i와 홀짝성이 같은 모든 a, j와 홀짝성이 같은 모든 b에 대해 (a, b)로 증식할 수 있다는 것이다.
또한, 충분히 큰 홀수번 증식 후에는 (i, j) 지점에 있는 곰팡이가 i와 홀짝성이 다른 모든 a, j와 홀짝성이 다른 모든 b에 대해 (a, b)로 증식할 수 있다는 뜻이기도 하다.
따라서, 곰팡이가 바닥 전체를 뒤덮는 시점이 생기려면 처음 곰팡이가 있던 지점들의 홀짝성만 체크하면 된다.
곰팡이가 있던 지점들이 (홀, 홀), (홀, 짝), (짝, 홀), (짝, 짝) 네 가지 경우를 모두 포함한다면 언젠가는 바닥 전체가 뒤덮이게 되는 것이다.
이를 코드로 구현하면 아래와 같다.
21행과 27행이 코드의 핵심적인 부분이라고 할 수 있다.
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
29
30
31
32
33
34
35
36
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ14671 {
int n, m;
boolean[][] molds = new boolean[2][2];
void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int x, y;
while (k-- > 0) {
st = new StringTokenizer(br.readLine());
x = Integer.parseInt(st.nextToken());
y = Integer.parseInt(st.nextToken());
molds[x % 2][y % 2] = true;
}
}
void solution() throws IOException {
input();
if (molds[0][0] && molds[0][1] && molds[1][0] && molds[1][1])
System.out.println("YES");
else System.out.println("NO");
}
public static void main(String[] args) throws IOException {
new BOJ14671().solution();
}
}
댓글남기기