[Kotlin] 프로그래머스 - 카펫
Kotlin문제
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항
갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
입출력 예
입출력 예 #1
- 입력
- brown: 10
- yellow: 2
- 출력: [4, 3]
입출력 예 #2
- 입력
- brown: 8
- yellow: 1
- 출력: [3, 3]
입출력 예 #3
- 입력
- brown: 24
- yellow: 24
- 출력: [8, 6]
풀이
전체 면적 = 가로 x 세로 = brown + yellow
둘레 절반 = 가로 + 세로 = brown / 2 + 2
노란 면적 = (가로 - 2) x (세로 - 2)
갈색 면적 = 전체 면적 - 노란 면적
코드
kotlin
class Solution {
fun solution(brown: Int, yellow: Int): IntArray {
val answer = IntArray(2)
val totalArea = brown + yellow // width * height
val halfLap = brown / 2 + 2 // width + height
// '가로 + 세로' 길이를 1씩 감소시키며 '가로 >= 세로'를 만족하는 크기까지만 확인한다.
for (width in halfLap - 1 downTo halfLap / 2) {
// 전체 면적을 가로 길이로 나누면 세로 길이가 나온다.
if (totalArea % width != 0) continue
// 검증
val height = halfLap - width
val yellowArea = (width - 2) * (height - 2)
val brownArea = totalArea - yellowArea
if (brownArea == brown && yellowArea == yellow) {
answer[0] = width
answer[1] = height
break
}
}
return answer
}
}
text
테스트 1 〉 통과 (0.01ms, 61.4MB)
테스트 2 〉 통과 (0.01ms, 61.8MB)
테스트 3 〉 통과 (0.02ms, 62.4MB)
테스트 4 〉 통과 (0.01ms, 61.8MB)
테스트 5 〉 통과 (0.01ms, 60.4MB)
테스트 6 〉 통과 (0.02ms, 60.6MB)
테스트 7 〉 통과 (0.02ms, 61.4MB)
테스트 8 〉 통과 (0.04ms, 60.9MB)
테스트 9 〉 통과 (0.02ms, 60.4MB)
테스트 10 〉 통과 (0.04ms, 59.7MB)
테스트 11 〉 통과 (0.01ms, 57.6MB)
테스트 12 〉 통과 (0.01ms, 59.2MB)
테스트 13 〉 통과 (0.01ms, 62MB)