10448번: 유레카 이론
let T = Int(readLine()!)!
var triNumArray = [Int]()
var n = 1
var triNum: Int
repeat {
triNum = n * (n + 1) / 2
n += 1
triNumArray.append(triNum)
} while triNum <= 1000
var sumArray = [Int]()
var sum: Int
for i in 0..<triNumArray.count {
for j in i..<triNumArray.count {
for k in j..<triNumArray.count {
sum = triNumArray[i] + triNumArray[j] + triNumArray[k]
if sum <= 1000 {
sumArray.append(sum)
}
}
}
}
for _ in 0..<T {
let k = Int(readLine()!)!
print(sumArray.contains(k) ? 1 : 0)
}
- 처음에는 수열의 관점에서 접근하려고 했으나 삼각수 3개의 합은 규칙적으로 증가하는 수열이 아니었습니다.
- k가 1000 밖에 되지 않으므로 모든 경우의 수를 다 찾아 놓고 입력값을 거기서 찾는 것이 가능합니다.
- 먼저 1000이하의 삼각수들을 모두 구합니다.
- 1000이하의 삼각수를 3개를 조합하여 (중복허용) 1000이하의 모든 삼각수 3개의 합을 구합니다.
- 마지막으로 k를 입력 받으면서 삼각수 3개의 합에 해당 수가 있는지 확입니다.