문제 설명
- 사진에 나온 것 처럼 인덱스에 맞게 숫자가 순차적으로 들어가고,
- 이 배열을 가로로 쫙 펼쳐서 1차원 배열로 만든다음에
- Left ... right 까지 잘라서 return하면 끝
문제 접근
- 문제 자체는 어렵지 않아보이는데 n이 n^7까지 있는거로 볼 때 시간초과를 유발하는 문제인 것 같다.
문제풀이
- 처음에는 matrix 만들어주고 했는데, 보니까 굳이 그럴 필요가 없어서 그것 조차 주석처리를 해줬다.
- 행,열 중 큰 값에 대해서 그 큰값+1을 이제 매트릭스에 새겨주는 방식이라고 이해하시면 될 것 같다.
import Foundation
func solution(_ n: Int, _ left: Int64, _ right: Int64) -> [Int] {
// var matrix = Array(repeating: Array(repeating: 0, count: n), count: n)
var answer = [Int]()
for i in 0 ..< n {
for j in 0 ..< n {
let max_value = max(i, j) + 1
// matrix[i][j] = max_value
answer.append(max_value)
}
}
var k = answer[Int(left) ... Int(right)].map { Int($0) }
return k
}
천천히 뜯어보면
123 223 333 나오는게 아까 max(i,j)+1 해준 것 처럼
Left가 2고 right가 5일때 지나가는 수는 2 3 4 5 이고
이걸 n으로 나누거나 나머지를 구하면
몫 : 2/3 나머지 : 1 이므로 0번째 줄에 1번째 라는 계산이 나온다. 그러면 여기에 max(몫,나머지)+1 하면은 그 값이 나오는 것이다. 그러면 n^2 이중 반복문 돌려줄 필요도없이 그냥 left부터 right까지 for문 한개로 되지 않을까 싶어서 그쪽으로 풀이를 틀어봤다.
개선작업
아까 말했듯이 max(Int(i) / n, Int(i) % n)
이 부분을 이제 left...right 반복문에 넣어주었다.
answer.append(max(Int(i) / n, Int(i) % n) + 1)
완성코드
import Foundation
func solution(_ n: Int, _ left: Int64, _ right: Int64) -> [Int] {
var answer = [Int]()
for i in left ... right {
answer.append(max(Int(i) / n, Int(i) % n) + 1)
}
return answer
}
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
타인의 코드
func solution(_ n: Int, _ left: Int64, _ right: Int64) -> [Int] {
return (left...right).map { max(Int($0) / n, Int($0) % n) + 1 }
}
나도 충분히 짧아서 깔끔한 코드라고 생각했는데 map, reduce같은거 좀 더 자유롭게 쓸 수 있게 좀 더 익숙해져야겠다는 생각을 했다.