티스토리 뷰
문제 설명
Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다. Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.
- 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
- 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
- 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.
예시
brown yellow return
10 | 2 | [4, 3] |
8 | 1 | [3, 3] |
24 | 24 | [8, 6] |
풀이
전체적인 구조를 설명하자면, 먼저 약수를 구하는 함수를 통해 yellow값의 약수를 구한다. 이때, yellow의 제곱근까지만 구하도록하여 yellow를 약수로 나눠 가로를 구할 때 세로보다 작아지지 않도록 해주었다.
구한 약수가 담긴 배열의 원소로 하나씩 yellow를 나눠 가로와 세로를 구한 뒤, (가로 + 세로 + 2) * 2가 brown과 동일하다면 break를 통해 반복문을 빠져나온다.
import Foundation
func solution(_ brown:Int, _ yellow:Int) -> [Int] {
var result: [Int] = [0,0]
var divisor: [Int] = []
var width: Int = 0
var height: Int = 0
//약수 구하는 함수
func getDivisor(_ number: Int) {
var result: [Int] = []
for i in 2...Int(sqrt(Double(number))) {
if number % i == 0 {
result.append(i)
}
}
divisor = result
}
if yellow == 1 {
result = [3, 3]
} else if yellow == 2 {
result = [4, 3]
} else if yellow == 3 {
result = [5, 3]
} else {
//약수 구하기
getDivisor(yellow)
if divisor.count == 0 {
// 약수가 없으면 가로로만 쭉 나열한 경우밖에 없음
result = [yellow + 2, 3]
} else {
for i in divisor {
height = i
width = yellow / i
if brown == (height + 2 + width) * 2 {
result = [width + 2, height + 2]
break
}
}
}
}
return result
}
결론
이번엔 검색을 하지않고 스스로 해결하긴했지만, 다른 분들의 코드와 비교해보았을 때 지금보다 더 짧게 작성이 가능했다. 접근 방식의 차이이긴하지만 내 코드는 조금 길어서 지저분해보이긴한다. 다음부터 조금 더 신경을 써보아야겠다.
완전탐색 문제들을 풀고있는데 조금 더 풀이를 빨리 생각해내기 위해서는 더 많이 풀어보아야 할 것 같다.
'PS' 카테고리의 다른 글
[Swift]프로그래머스_프린터 (0) | 2022.04.19 |
---|---|
[Swift]프로그래머스_기능개발 (0) | 2022.04.18 |
[Swift]프로그래머스_H-Index (0) | 2022.04.17 |
[Swift]프로그래머스_가장 큰 수 (0) | 2022.04.17 |
[Swift]프로그래머스_소수 찾기 (0) | 2022.04.16 |
댓글
최근에 올라온 글
- Total
- Today
- Yesterday