sm 기술 블로그
166. 1780(종이의 개수) - 자바 본문
import java.util.*;
import java.io.*;
class Main {
static int[][] paper;
static int cntPlus;
static int cntZero;
static int cntMinus;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
paper = new int[N][N];
for (int i = 0; i < N; i++) {
String[] tmp1 = br.readLine().split(" ");
for (int j = 0; j < N; j++) {
paper[i][j] = Integer.parseInt(tmp1[j]);
}
}
cntPlus = 0;
cntZero = 0;
cntMinus = 0;
find(0, 0, N);
System.out.println(cntMinus);
System.out.println(cntZero);
System.out.println(cntPlus);
}
private static void find(int x, int y, int N) {
int color = paper[x][y];
for (int i = x; i < x + N; i++) {
for (int j = y; j < y + N; j++) {
if (color != paper[i][j]) {
for (int k = 0; k < 3; k++) {
for (int l = 0; l < 3; l++) {
find(x + k * N / 3, y + l * N / 3, N / 3);
}
}
return;
}
}
}
if (color == -1) cntMinus++;
else if (color == 0) cntZero++;
else cntPlus++;
}
}
문제요약
9개로 나누면서 온전한 N*N 색종이를 만들어라
설명
단순히 생각하면 된다.
이런 종이가 N*N 색종이로 표현이 불가능 할때,
다음과 같이 나누고 또 N*N이 되지 않을 때
이런식으로 9개씩 나눈다는 이야기이다.
int color = paper[x][y];
색상을 하나 픽해준다.
for (int i = x; i < x + N; i++) {
for (int j = y; j < y + N; j++) {
if (color != paper[i][j]) {
이제 비교를 하는데 픽한 색상과 다르다면 if문 조건에 들어간다.
for (int k = 0; k < 3; k++) {
for (int l = 0; l < 3; l++) {
find(x + k * N / 3, y + l * N / 3, N / 3);
}
}
return;
}
}
}
색상이 다를경우 9개로 나누어야 한다.
따라서 k와 l을 통해 9번 find함수가 실행되고
9등분한 각 부분의 첫번째를 x,y에 넣어 find를 호출한다.
if (color == -1) cntMinus++;
else if (color == 0) cntZero++;
else cntPlus++;
각 색상의 카운터를 바로바로 증가시켜준다.
System.out.println(cntMinus);
System.out.println(cntZero);
System.out.println(cntPlus);
출력을 통해 원하는 결과를 얻을 수 있다.
'문제 > 백준_자바' 카테고리의 다른 글
168. 1629(이항계수3) - 자바 (0) | 2022.08.01 |
---|---|
167. 1629(곱셈) - 자바 (0) | 2022.07.31 |
165. 1992(쿼드트리) - 자바 (0) | 2022.07.30 |
164. 2630 (색종이 만들기) - 자바 (0) | 2022.07.30 |
163. 5430(AC) - 자바 (0) | 2022.07.28 |
Comments