개발새발 - IT 기술블로그
article thumbnail

백준 알고리즘  - 코틀린 풀이

 

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

 

9063번: 대지

첫째 줄에는 점의 개수 N (1 ≤ N ≤ 100,000) 이 주어진다. 이어지는 N 줄에는 각 점의 좌표가 두 개의 정수로 한 줄에 하나씩 주어진다. 각각의 좌표는 -10,000 이상 10,000 이하의 정수이다. 

www.acmicpc.net


 

 

문제

 

 


 

정답

import java.util.*

fun main() = with(Scanner(System.`in`)){
    val num = nextInt()
    var minX = Int.MAX_VALUE
    var minY = Int.MAX_VALUE
    var maxX = Int.MIN_VALUE
    var maxY = Int.MIN_VALUE

    for(i in 0 until(num)) {
        val x = nextInt()
        val y = nextInt()

        minX = minOf(minX, x)
        minY = minOf(minY, y)
        maxX = maxOf(maxX, x)
        maxY = maxOf(maxY, y)
    }

    println((maxX - minX) * (maxY-minY))
}

 


 

 

풀이

이번 문제는 점의 개수와 점들의 좌표값을 입력받고, 그 점들로 둘러쌓인 직사각형의 넓이를 구하는 문제입니다.

 

직사각형의 넓이는 가로 x 세로이고, 점들이 사각형의 변에 위치한다는 힌트를 이용해 풀 수 있는데요.

 

문제의 그림과 같이 x좌표의 값들 중 최대값과 최솟값의 차가 가로의 길이가 되고, y좌표의 값들 중 최대값과 최솟값의 차가 세로의 길이가 됩니다.

 

따라서 입력받은 좌표들 중 최솟값과 최댓값을 갱신시켜가며 입력이 끝났을 때의 값들의 곱으로 넓이를 구하시면 됩니다.

minX = minOf(minX, x)
minY = minOf(minY, y)
maxX = maxOf(maxX, x)
maxY = maxOf(maxY, y)

 

※ 문제에서 입력으로 주어진 점 1개는 직사각형을 완성시킬 수 없어 최대, 최솟값이 동일하므로 자연스럽게 0이 출력됩니다.

 

감사합니다.