본문 바로가기

알고리즘

프로그래머스 - 바탕화면 정리(Kotlin)

본 알고리즘 풀이는 Routine Study에서 진행하고 있습니다.

https://github.com/ROUTINE-STUDY/Algorithm

 

저를 포함한 구성원이 대부분 초보이므로, 원하시는분은 언제라도 들어오셔도 좋습니다.

 

GitHub - ROUTINE-STUDY/Algorithm: 초보 알고리즘 스터디 / 누구나 참여 가능

초보 알고리즘 스터디 / 누구나 참여 가능 :runner:. Contribute to ROUTINE-STUDY/Algorithm development by creating an account on GitHub.

github.com

문의는 댓글 바람.

 

문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/161990?language=kotlin

[문제 설명]

바탕화면에 모든 파일을 선택하는 사각형을 구하라.

[접근 방법]

가장 작은 x좌표부터 가장 큰 x좌표, 가장 작은 y좌표부터 가장 큰 y좌표가 최소 영역이다.

fun main() {
    val solutionObject = Solution()
    // test code
    println(solutionObject.solution(arrayOf("#...", "....")).contentEquals(intArrayOf(0,0,1,1)))
    println(solutionObject.solution(arrayOf("#....")).contentEquals(intArrayOf(0, 0, 1, 1)))
    println(solutionObject.solution(arrayOf("#")).contentEquals(intArrayOf(0, 0, 1, 1)))
}

class Solution {
    fun solution(wallpaper: Array<String>): IntArray {
        // 왼쪽 위가 0,0
        // 빈칸 : '.'
        // 파일 : '#'
        // 최소한의 이동거리를 갖는 한번의 드래그로 모든 파일을 선택해서 지우기.
        var minX = Int.MAX_VALUE
        var minY = Int.MAX_VALUE
        var maxY = Int.MIN_VALUE
        var maxX = Int.MIN_VALUE
        for (r in wallpaper.indices) {
            val line = wallpaper[r]
            line.toCharArray().forEachIndexed { idx, block ->
                if (block == '#') {
                    minX = minX.coerceAtMost(idx)
                    minY = minY.coerceAtMost(r)
                    maxX = maxX.coerceAtLeast(idx)
                    maxY = maxY.coerceAtLeast(r)
                }
            }
        }
        return intArrayOf(minY, minX, maxY + 1, maxX + 1)
    }
}
728x90
반응형