백준 특정 알고리즘 문제 풀이 후, 체득하기 위해 정리하는 글입니다.
| 문제번호 | 제목 | 난이도 |
|---|---|---|
| 2630 | 색종이 만들기 | 실버 2 |
| 1992 | 쿼드트리 | 실버 1 |
| 1780 | 종이의 개수 | 실버 2 |
import java.io.*;
import java.util.*;
/**
* 풀이 과정:
* - 고민과 풀이:
*
* 재귀
* 1. 함수 형태 confetti(field, x,y, size)
* 2. base Condition 특정 조건에 해당하는 경우 해당 좌표에 해당하는 배열의 값 증가시키고 종료
* -> 모든 주어진 크기만큼 배열의 모든 좌표를 돌아 같은값으로만 이루어져있는지 확인
* 3. 재귀식
* 분할정복으로 4번 돌아주면 된다
* confetti(field, x,y, size/2);
* confetti(field, x,y+size/2, size/2);
* confetti(field, x+size/2,y, size/2);
* confetti(field, x+size/2,y+size/2, size/2);
*
* - 문제 해결:
*
* 시간복잡도: O()
* 공간복잡도: O()
*
*/
public class Main {
static int[] ans = {0,0};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int[][] field = new int[n][n];
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
field[i][j] = Integer.parseInt(st.nextToken());
}
}
confetti(field, 0,0, n);
for (int an : ans) {
bw.write(an+"\n");
}
br.close();
bw.close();
}
private static void confetti(int[][] field, int x, int y, int size) {
if(sameColor(field, x,y, size)){
ans[field[y][x]]++;
return;
}
int newSize = size / 2;
confetti(field, x,y, newSize);
confetti(field, x,y+ newSize, newSize);
confetti(field, x+ newSize,y, newSize);
confetti(field, x+ newSize,y + newSize, newSize);
}
private static boolean sameColor(int[][] field, int x, int y, int size) {
int now = field[y][x];
for (int i = y; i < y + size; i++) {
for (int j = x; j < x + size; j++) {
if(field[i][j] != now){
return false;
}
}
}
return true;
}
}
import java.io.*;
import java.util.*;
/**
* 고민과 풀이:
*
* 재귀
* 1. 함수식 quadTree(field, size, x,y)
* 2. base Condition 특정 조건을 만족하는 경우
* -> 주어진 범위 내에서 배열을 순회했을 때, 모두 같은 경우
* 3. 재귀식 4개로 분할정복해서 푼다 -> 참고로 아래 순서 지켜야 함...
* - quadTree(field, size/2, x,y)
* - quadTree(field, size/2, x+size/2,y)
* - quadTree(field, size/2, x,y+size/2)
* - quadTree(field, size/2, x+size/2,y+size/2)
* - 또한 추가로 각 분할정복을 통과하기전에 "("을 추가한다.
* - 마지막 분할 정복을 통과하면 ")"울 추가한다.
*
* 문제 해결:
*
* 시간복잡도: O()
* 공간복잡도: O()
*
*
*/
public class Main {
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int[][] field = new int[n][n];
for (int i = 0; i < n; i++) {
String[] input = br.readLine().split("");
for (int j = 0; j < n; j++) {
field[i][j] = Integer.parseInt(input[j]);
}
}
quadTree(field, n, 0,0);
bw.write(sb.toString());
br.close();
bw.close();
}
private static void quadTree(int[][] field, int size, int x, int y) {
if(isSame(field, size, x,y)){
sb.append(field[y][x]);
return;
}
int newSize = size / 2;
sb.append("(");
quadTree(field, newSize, x,y);
quadTree(field, newSize, x+newSize,y);
quadTree(field, newSize, x,y+newSize);
quadTree(field, newSize, x+newSize,y+newSize);
sb.append(")");
}
private static boolean isSame(int[][] field, int size, int x, int y) {
int now = field[y][x];
for (int i = y; i < y+size; i++) {
for (int j = x; j < x + size; j++) {
if(now != field[i][j]){
return false;
}
}
}
return true;
}
}
import java.io.*;
import java.util.*;
/**
* 풀이 과정:
* - 고민과 풀이:
* 재귀
* 1. 함수 형태: paper(종이 정보가 담긴 배열, x,y, n/3)
* 2. base Condition 특정 함수 조건을 만족시키는 경우 -> 그 줄의 좌표를 가져와서 해당 Map의 값을 증가시켜준다
* -> 이떄 특정 함수 조건은 조어진 필드 범위 내에서 같은 숫자로만 이루어져 있는지 확인하는 함수이다.
* 3. 재귀식 총 9개를 돌려준다.
* paper(종이 정보가 담긴 배열, x,y, n/3)
* paper(종이 정보가 담긴 배열, x+n/3,y, n/3)
* paper(종이 정보가 담긴 배열, x+2*(n/3),y, n/3)
* paper(종이 정보가 담긴 배열, x,y+n/3, n/3)
* paper(종이 정보가 담긴 배열, x+n/3,y+n/3, n/3)
* paper(종이 정보가 담긴 배열, x+2*(n/3),y+n/3, n/3)
* paper(종이 정보가 담긴 배열, x,y+2*(n/3), n/3)
* paper(종이 정보가 담긴 배열, x+n/3,y+2*(n/3), n/3)
* paper(종이 정보가 담긴 배열, x+2*(n/3),y+2*(n/3), n/3)
*
*
* - 문제 해결:
*
* 시간복잡도: O()
* 공간복잡도: O()
*
*/
public class Main {
static Map<Integer, Integer> map = new HashMap<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int[][] field = new int[n][n];
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
field[i][j] = Integer.parseInt(st.nextToken());
}
}
map.put(-1,0);
map.put(0,0);
map.put(1,0);
paper(field, 0,0, n);
for (Integer i : map.values()){
bw.write(i+"\n");
}
br.close();
bw.close();
}
private static void paper(int[][] field, int x, int y, int size) {
if(onlyOne(field, x,y,size)){
map.put(field[y][x],map.get(field[y][x])+1);
return;
}
int newSize = size / 3;
paper(field,x,y, newSize);
paper(field,x+ newSize,y, newSize);
paper(field,x+(2* (newSize)),y, newSize);
paper(field,x,y + newSize, newSize);
paper(field,x+ newSize,y + newSize, newSize);
paper(field,x+(2* (newSize)),y + newSize, newSize);
paper(field,x,y+(2* (newSize)), newSize);
paper(field,x+ newSize,y+(2* (newSize)), newSize);
paper(field,x+(2* (newSize)),y+(2* (newSize)), newSize);
}
private static boolean onlyOne(int[][] field, int x, int y, int size) {
int now = field[y][x];
for (int i = y; i < y+size; i++) {
for (int j = x; j < x+size; j++) {
if(field[i][j] != now){
return false;
}
}
}
return true;
}
}