본문 바로가기

코딩 테스트/Lv.2

[프로그래머스] 카펫 with Kotlin

문제

중앙에 노란색, 테두리 갈색 카펫에서 노란색과 갈색 개수만 알고 있을 때, 카펫의 가로 세로 크기를 순서대로 배열에 담아 return 하는 문제

 

제한 사항

  • 갈색 격자의 수 brown은 8이상 5,000 이하인 자연수
  • 노란색 격자의 수 yellow는 1이상 2,000,000 이하인 자연수
  • 카펫의 가로의 길이는 세로와 같거나 세로보다 길다.

 

풀이 방법

  • 가로 >= 세로 이므로 세로 길이의 최대는 yellow+brown 값의 제곱근
  • 노란색 가로 = yellow / 세로
  • 노란색 격자를 바탕으로 갈색 격자의 수를 구한 뒤 brown 값과 같으며, yellow % 세로 == 0 이면 카펫의 크기

 

코드

import kotlin.math.sqrt
class Solution {
    fun solution(brown: Int, yellow: Int): IntArray {
        val h_max = sqrt((brown+yellow).toDouble()).toInt()
        var (w, h) = arrayOf(0,0)
        
        for(height in 1..h_max){
            var width = yellow/height
            if(width < height) break
            
            if(2*(width+2)+2*(height+2)-4 == brown && yellow%height == 0) {
                w = width+2
                h = height+2
                break
            }
        }
        
        return intArrayOf(w, h)
    }
}