Level 3문제는 손을 대 봤지만 너무 어려워서 학습이 불가한 수준이라 Level 2로 살짝 내려왔다.
우선 좀 어느정도 수준의 문제에 와서는 그냥 직접 해결하는 것보다 이해하는 것부터가 좀 어려웠다. 그리고 내가 return해야하는 것을 표현을 할 수 있어야 했다.
우선, brown 과 yellow가 주어졌을때, 이 수들을 이용해 가로와 세로로 변환해야 했다.
([x, y]라 가정)
이렇게 방정식을 세울 수 있다. 그리고 구체적인 x, y 를 확정시키기 위해 한 가지 더 식을 세우자면
저 그림에 대조했을때 이런 식을 세울 수 있다. 이러한 식을 바탕으로 코드를 대입할 수 있는 가를 묻는 것이 알고리즘 문제인 거 같다고 느꼈다.
처음 시도는
import Foundation
func solution(_ brown:Int, _ yellow:Int) -> [Int] {
var sum = brown + yellow
var result = [Int]()
for i in 3...sum{
if sum % i == 0 {
var j = sum / i
if (i-2) * (j-2) == yellow{
result.append(i)
result.append(j)
}
}
}
return result
}
이렇게 구성했는데 실패했다. 그래도 세가지 케이스 중 하나는 성공해서 희망적이었고 꽤 그럴듯하게 짰다고 생각했다. 앞서 말한 것처럼 먼저 논리를 정리하고 코드를 구성할 생각을 하니 한결 수월했다. 코드가 4개씩 추가된 부분이 있는데 그것들만 잘 수정하면 될 것 같다. [3, 4, 4, 3] 이런식으로 가로 세로가 바뀌게 추가된거 같다.
import Foundation
func solution(_ brown:Int, _ yellow:Int) -> [Int] {
var sum = brown + yellow
var result = [Int]()
for i in 3...sum{
if sum % i == 0 {
var j = sum / i
if (i-2) * (j-2) == yellow && i >= j{
result.append(i)
result.append(j)
}
}
}
return result
}
이렇게 논점을 집어가며 푸니까 오류가 발생하더라도 쉽게 해결 할 수 있었다.
다른사람의 풀이를 보아도
import Foundation
func solution(_ brown:Int, _ red:Int) -> [Int] {
var result:[Int] = []
let sum = brown + red
print("sum = \(sum)")
let limit = Int(sqrt(Double(sum)))
print("limit = \(limit)")
for i in 3..<limit+1 {
if (sum % i) == 0 {
let a = sum/i
if ((a-2)*(i-2)) == red {
result.append(a)
result.append(i)
break
}
}
}
return result
}
(이전엔 red 였던듯함)
좀더 길게 복잡하게 적었지만 그 구조 자체는 비슷함을 알 수 있었다. 이로써 알고리즘을 푸는 구조에 대해서 조금은 안듯한 기분이다.