문제 설명
1. 그림처럼 테두리 한줄이 갈색으로 주어지고
2. 내부 노른자 부분은 노란색으로 칠해진다고 할 때
3. brown, yellow 타일수가 주어졌을 때 이게 어떤 정,직사각형인지 너비 높이 구하면 끝!
문제 접근
- 일단 한줄이 주어진다고 했으니까 한줄을 구하자면은
- 2width + 2hight - 4 가 갈색의 타일 수 겠구나 하면서 출발을 했다. (-4는 너비랑 높이를 곱하기하는과정에서 사각에 해당하는 4개의 타일)
- 노른자는 이제 테두리 한줄을 없애는거니까 양변에 해당하는 -2 ,-2 를 각각 너비,높이에서 빼준걸 곱한 형태이다 (width-2)*(height-2)
문제풀이 (정리하면..)
- Brown =
2W+2H-4
- Yellow = `(W-2)*(H-2)
두개의 방정식을 잘 활용하면 될 것 같다 !
func isFine(_ brown: Int, _ yellow: Int, _ width: Int, _ height: Int) -> Bool {
return (width*2 + height*2 - 4) == brown && (
width*2 + height*2 - 4
) == yellow && width >= height
}
width,height를 뭐 숫자없이 선언하자니 웃기고, 그렇다고 1로 초기화하는건 아닌것같고,,하다가 for문으로 하나씩 대입해주는 방식으로 해결하고자했다.
이제 FOR문의 범위를 정해야하는데,,,
1. brown이 결국2W+2H-4
에 해당하니까 결국 brown/2정도까지는 넉넉한 범위라고 생각했다.
2. height는 최소 네모크기가 3,3이니까 3부터 높이까지로해서 for문을 돌려주었다.
import Foundation
func isFine(_ brown: Int, _ yellow: Int, _ width: Int, _ height: Int) -> Bool {
return (width * 2 + height * 2 - 4) == brown && (
(width - 2) * (height - 2)
) == yellow && width >= height
}
func solution(_ brown: Int, _ yellow: Int) -> [Int] {
for i in stride(from: brown / 2, through: 3, by: -1) {
for j in 3 ... i {
if isFine(brown, yellow, i, j) {
return [i, j]
}
}
}
return []
}
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
엄청 예전에 풀었던게 기억이 났는데, 그때는 답을보고도 왜 -4지 ?하면서 이해가 안됐었던 것 같은데, 이제는 알아서 풀리는걸 보니 그때보다는 좀 나아졌구나 싶다..
타인의 코드
import Foundation
func solution(_ brown: Int, _ red: Int) -> [Int] {
for n in (1...Int(sqrt(Double(red)))).reversed() {
if (red/n+2) * (n+2) == (brown + red) {
return [(red/n+2), n+2]
}
}
return [0, 0]
}
- 내가 지금까지 본 정답코드 중에 제일 좋았던 것 같다.
(W-2) * (H-2) = YELLOW
이라는 관계를 포착했지만, 이걸 반대로 생각하면,- 결국 우리가 찾고자 하는 것은 전체 박스의 크기
W * H
라서,yellow
의 약수를 찾으면, 이 약수 쌍이(W-2)
와(H-2)
에 대응된다는 것이다 !!
W = a + 2
H = b + 2
로 계산할 수 있다.- 전체 타일의 크기
W * H
가(brown + yellow)
와 일치하는지 검증하면 이제 답을 찾을 수 있다.