250x250
Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 막내의막무가내 안드로이드
- 프로그래머스 알고리즘
- 막내의막무가내 알고리즘
- 막무가내
- 주택가 잠실새내
- 막내의막무가내 목표 및 회고
- 막내의막무가내 SQL
- 막내의막무가내 플러터 flutter
- 막내의막무가내 안드로이드 에러 해결
- 막내의 막무가내 알고리즘
- 막내의막무가내 프로그래밍
- 막내의막무가내 안드로이드 코틀린
- 막내의막무가내 코틀린
- 막내의막무가내 플러터
- 막내의막무가내 코틀린 안드로이드
- 프래그먼트
- 막내의막무가내
- 안드로이드
- Fragment
- 부스트코스에이스
- 막내의막무가내 코볼 COBOL
- 막내의막무가내 rxjava
- 안드로이드 sunflower
- flutter network call
- 주엽역 생활맥주
- 부스트코스
- 막내의막무가내 일상
- 안드로이드 Sunflower 스터디
- 막내의 막무가내
- 2022년 6월 일상
Archives
- Today
- Total
막내의 막무가내 프로그래밍 & 일상
[알고리즘] 백준 1780 종이의 개수 -분할정복- 자바 코틀린 본문
728x90
1780번: 종이의 개수
N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이때 다음의 규칙에 따라 자르려고 한다.
www.acmicpc.net
백준 분할정복 단계별풀기 3단계 문제입니다.
이전에 푼것들과 동일한데 이번에는 4등분이 아닌 9등분을 합니다.
기존 4번 분할하던것을 9분할로만 변경하면 해결됩니다.
풀이는 다음과 같습니다.
[Java]
import java.util.Scanner;
public class Main {
private static int[][] map;
private static int zero = 0;
private static int one = 0;
private static int minus1 = 0;
private static void dfs(int n, int x, int y) {
if (n == 1) {
int num = map[y][x];
if (num == -1) {
minus1++;
} else if (num == 0) {
zero++;
} else {
one++;
}
return;
}
if (isSame(n, x, y)) {
return;
}
dfs(n / 3, x, y);
dfs(n / 3, x + n / 3, y);
dfs(n / 3, x + 2 * n / 3, y);
dfs(n / 3, x, y + n / 3);
dfs(n / 3, x, y + 2 * n / 3);
dfs(n / 3, x + n / 3, y + n / 3);
dfs(n / 3, x + n / 3, y + 2 * n / 3);
dfs(n / 3, x + 2 * n / 3, y + n / 3);
dfs(n / 3, x + 2 * n / 3, y + 2 * n / 3);
}
private static boolean isSame(int n, int x, int y) {
int first = map[y][x];
for (int i = y; i < y + n; i++) {
for (int j = x; j < x + n; j++) {
if (first != map[i][j]) {
return false;
}
}
}
//해당 종이 하나로 압축
if (first == 0) {
zero++;
} else if (first == 1) {
one++;
} else {
minus1++;
}
return true;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int size = sc.nextInt();
map = new int[size][size];
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
map[i][j] = sc.nextInt();
}
}
dfs(size, 0, 0);
System.out.println(minus1);
System.out.println(zero);
System.out.println(one);
}
}
[Kotlin]
import java.util.*
private lateinit var map: Array<IntArray>
private var zero = 0
private var one = 0
private var minus1 = 0
private fun dfs(n: Int, x: Int, y: Int) {
if (n == 1) {
when (map[y][x]) {
-1 -> {
minus1++
}
0 -> {
zero++
}
else -> {
one++
}
}
return
}
if (isSame(n, x, y)) {
return
}
dfs(n / 3, x, y)
dfs(n / 3, x + n / 3, y)
dfs(n / 3, x + 2 * n / 3, y)
dfs(n / 3, x, y + n / 3)
dfs(n / 3, x, y + 2 * n / 3)
dfs(n / 3, x + n / 3, y + n / 3)
dfs(n / 3, x + n / 3, y + 2 * n / 3)
dfs(n / 3, x + 2 * n / 3, y + n / 3)
dfs(n / 3, x + 2 * n / 3, y + 2 * n / 3)
}
private fun isSame(n: Int, x: Int, y: Int): Boolean {
val first = map[y][x]
for (i in y until y + n) {
for (j in x until x + n) {
if (first != map[i][j]) {
return false
}
}
}
//해당 종이 하나로 압축
when (first) {
0 -> {
zero++
}
1 -> {
one++
}
else -> {
minus1++
}
}
return true
}
fun main(args: Array<String>) {
val sc = Scanner(System.`in`)
val size = sc.nextInt()
map = Array(size) { IntArray(size) }
for (i in 0 until size) {
for (j in 0 until size) {
map[i][j] = sc.nextInt()
}
}
dfs(size, 0, 0)
println(minus1)
println(zero)
println(one)
}
728x90
'알고리즘 > 분할정복' 카테고리의 다른 글
[알고리즘] 백준 1074 Z -분할정복- 자바 (0) | 2020.11.10 |
---|---|
[알고리즘] 백준 1629 곱셈 - 분할정복- 자바 (0) | 2020.10.18 |
[알고리즘] 백준 1992 쿼드트리 -분할정복- 자바 (0) | 2020.10.18 |
[알고리즘] 프로그래머스 쿼드압축 후 개수 세기 (월드 코드 챌린지 시즌 1) -dfs, 백트랙킹- 자바 코틀린 (0) | 2020.10.14 |
Comments