728x90
[Swift] 프로그래머스 카펫(lv. 2)
1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/42842
2. 접근
중앙에는 노란색으로 칠해져있고, 테두리는 갈색인 카펫이라고 했다.
그렇다면, 내부에는 정사각형이든 직사각형이고, 테두리는 1줄로 고정되어 있는 것이다.
그러면 전체 카펫 가로 세로 길이가 각각 x, y라고 한다면, 노란색 부분의 면적은 항상 (x - 2) * (y - 2) 가 된다.
그러면 한 칸의 길이를 1 * 1로 생각하고, 전체 칸의 개수를 가지고 탐색을 해보면 될 것이다.
sum을 인덱스로 나눈 값을 임의로 x, 인덱스를 y로 해준다. 가로 길이가 같거나 더 크기 때문이다.
(인덱스가 0부터 올라가기 때문에, 나누어지면 항상 x가 크게 되어있다. y가 더 커지기 전에 정답이 찾아진다.)
sum은 전체 넓이(카펫 칸의 개수)이므로, x * y는 항상 sum이다.
만약 sum이 i 즉, y로 나누어 떨어지지 않는다면, 적절한 가로 세로 길이가 아니기 때문에 지나가준다.
이것을 통과하고 (x - 2) * (y - 2) == yellow라면, 정답 길이를 찾은 것이다. 그러면 전체 카펫 가로 세로 길이인 [x, y]를 리턴해주면 된다.
3. 코드
import Foundation
func solution(_ brown:Int, _ yellow:Int) -> [Int] {
let sum = brown + yellow
var x = 1
var y = 1
for i in 1 ... sum {
if sum % i == 0 {
x = sum / i
y = i
}
if (x - 2) * (y - 2) == yellow {
break
}
}
return [x, y]
}
728x90
'Problem Solving' 카테고리의 다른 글
[Swift] 프로그래머스 영어 끝말잇기(lv. 2) (1) | 2023.03.11 |
---|---|
[Swift] 프로그래머스 N개의 최소공배수(lv. 2) (0) | 2023.03.10 |
[Swift] 프로그래머스 짝지어 제거하기(lv. 2) (0) | 2023.03.07 |
[Swift] 프로그래머스 다음 큰 숫자(lv. 2) (0) | 2023.03.06 |
[Swift] 프로그래머스 피보나치 수(lv. 2) (0) | 2023.03.03 |
댓글