본문 바로가기

알고리즘/백준 문제풀이

백준 2628 - 종이 자르기(Kotlin)

728x90

https://www.acmicpc.net/problem/2628

 

2628번: 종이자르기

아래 <그림 1>과 같이 직사각형 모양의 종이가 있다. 이 종이는 가로방향과 세로 방향으로 1㎝마다 점선이 그어져 있다. 가로 점선은 위에서 아래로 1번부터 차례로 번호가 붙어 있고, 세로 점선

www.acmicpc.net

문제 접근

종이를 배열로 표현해서 자른 부분을 1로 처리한 다음 연속되는 0의 최대값을 곱해주면 됨

-> 어차피 한줄 끝까지 자르니깐 이차원 배열이 아닌 가로세로 각각 일차원 배열로 선언해서 연속되는 0의 개수의 최대값을 구하면 될듯?

 

정답 코드

import java.util.*

fun main(args: Array<String>): Unit = with(Scanner(System.`in`)) {
    val n = nextInt() //가로
    val m = nextInt() //세로

    val cutN = IntArray(n + 1)
    val cutM = IntArray(m + 1)

    val cutNum = nextInt()
    for (i in 0 until cutNum) {
        val xy = nextInt() //자를 선 가로세로 구분
        val wh = nextInt() //자르는 번호
        if (wh == 0) { //안 자르는 경우
            continue
        }
        if (xy == 0) { //가로로 자름
            cutM[wh] = 1
        } else if (xy == 1) { //세로로 자름
            cutN[wh] = 1
        }
    }

    var maxX = 0
    var temp = 0
    //배열에서 연속되는 0의 최대값을 구하면 됨
    for (j in 1..n) {

        temp++
        if (cutN[j] == 1 || j == n) {
            maxX = Math.max(temp, maxX)
            temp = 0
        }


    }
    var maxY = 0
    temp = 0
    for (j in 1..m) {
        temp++
        if (cutM[j] == 1 || j == m) {
            maxY = Math.max(temp, maxY)
            temp = 0
        }


    }
    print(maxX * maxY)

}