문제에 친절하게 애니메이션 설명까지 나와있었다.
우선 직접 행렬을 만들어서 푸는건 어려울거 같고, 접근이 어려웠다..
어떤식으로 접근할지조차 모르니까 그냥 손을 댈 수도 없었다.
한참을 손놓고 있다가 규칙이 없으면 못풀겠다 생각이 들어서 하나하나 들여다 보았다. 얼핏보면 보이지 않았지만, 결론적으로 찾았다.
규칙은 left와 right사이의 수를 n으로 나눈후 +1 하거나, n으로 나눈 나머지에 +1 을 한 수중 큰 수가 오는 것이다. 결국 행렬과는 관계가 없는게 맞았다.
import Foundation
func solution(_ n:Int, _ left:Int64, _ right:Int64) -> [Int] {
var result: [Int] = []
for i in Int(left)...Int(right){
if i / n > i % n {
result.append(i/n+1)
}else{
result.append(i%n+1)
}
}
return result
}
한번 규칙을 찾고나니 코드 자체는 간단했다. 한가지는 int64를 문제에서 굳이 고집해서 Int를 써야한다는점 정도 말고는 간단했다.
다른사람의 풀이로는
func solution(_ n: Int, _ left: Int64, _ right: Int64) -> [Int] {
return (left...right).map { max(Int($0) / n, Int($0) % n) + 1 }
}
똑같은 구조이지만 map을 사용해서 1줄로 아주 간단하게 끝냈다. 어차피 모든 원소에 대해서 적용하는 것이라면 for문이 아니라 맵이 더 좋았을 거 같다.