알고리즘 공부/미분류

백준 1780번 with 코틀린

_우지 2021. 8. 4. 04:33

종이의 개수 성공

시간 제한메모리 제한제출정답맞은 사람정답 비율

2 초 256 MB 19244 11316 8522 59.066%

문제

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이때 다음의 규칙에 따라 자르려고 한다.

  1. 만약 종이가 모두 같은 수로 되어 있다면 이 종이를 그대로 사용한다.
  2. (1)이 아닌 경우에는 종이를 같은 크기의 9개의 종이로 자르고, 각각의 잘린 종이에 대해서 (1)의 과정을 반복한다.

이와 같이 종이를 잘랐을 때, -1로만 채워진 종이의 개수, 0으로만 채워진 종이의 개수, 1로만 채워진 종이의 개수를 구해내는 프로그램을 작성하시오.

입력

첫째 줄에 N(1 ≤ N ≤ 37, N은 3k 꼴)이 주어진다. 다음 N개의 줄에는 N개의 정수로 행렬이 주어진다.

출력

첫째 줄에 -1로만 채워진 종이의 개수를, 둘째 줄에 0으로만 채워진 종이의 개수를, 셋째 줄에 1로만 채워진 종이의 개수를 출력한다.

예제 입력 1 복사

9 0 0 0 1 1 1 -1 -1 -1 0 0 0 1 1 1 -1 -1 -1 0 0 0 1 1 1 -1 -1 -1 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 -1 0 1 -1 0 1 -1 0 -1 1 0 1 -1 0 1 -1 0 1 -1 1 0 -1 0 1 -1

예제 출력 1 복사

10 12 11

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.lang.Math.pow
import java.lang.NumberFormatException
import kotlin.math.abs
import kotlin.math.pow
import kotlin.math.sqrt
 
 
val br = BufferedReader(InputStreamReader(System.`in`))
var num = br.readLine()!!.toInt()
var arr = MutableList(num,{ MutableList(num,{0})})
var fp1 = 0
var fn1 = 0
var f0 = 0
fun main()=with(br){
    val bw = BufferedWriter(OutputStreamWriter(System.out))
    for(i in 0 until num){
        arr[i]=readLine()!!.split(" ").map{it.toInt()}.toMutableList()
    }
    sol(num,0,0)
    println(fn1)
    println(f0)
    println(fp1)
    bw.flush()
    bw.close()
}
fun sol(size:Int, a:Int,b:Int){
    var size = size
    var count_0 = 0
    var count_n1 = 0
    var count_p1 = 0
    for(i in a until a+size){
        for(k in b until b+size){
            if(arr[i][k]==0) {
                count_0++
            }
            else if(arr[i][k]==1) {
                count_p1++
            }
            else if(arr[i][k]==-1){
                count_n1++
            }
        }
    }
    if(count_0==size*size){
        f0++
    }
    else if(count_p1==size*size){
        fp1++
    }
    else if(count_n1==size*size){
        fn1++
    }
    else{
        if(size!=1) {
            sol(size / 3, a , b )
            sol(size / 3, a , b + (size / 3))
            sol(size / 3, a , b + 2*(size / 3))
            sol(size / 3, a + (size / 3), b )
            sol(size / 3, a + (size / 3), b + (size / 3))
            sol(size / 3, a + (size / 3), b + 2*(size / 3))
            sol(size / 3, a + 2*(size / 3), b )
            sol(size / 3, a +2*(size / 3), b + (size / 3))
            sol(size / 3, a + 2*(size / 3), b + 2*(size / 3))
        }
    }
}
 
 
 
cs