1. 처음 아이디어는 n크기의 이중배열을 만들고, for문을 사용해 전체 행렬을 완성한 다음, flatMap으로 중첩된 배열을 제거해 left, rigft 인덱스로 슬라이스하는 것이었다. 그런데 n크기가 10^7인데 for문을 3번 중첩하다보니 시간초과가 났다. 힌트를 보고 전체 행렬을 구할 필요가 없이 인덱스에 해당하는 수를 계산할 수 있도록 코드를 구성해야 한다는 것을 깨달았다.
2. left와 right를 인덱스가 아닌 배열에서 n번째, 즉 인덱스+1이 주어진 것이라 착각하고 풀었다. 해당 인덱스가 속한 행과 인덱스를 n으로 나눈 값의 관계를 이용했다. 통과는 했지만 시간제한이 있었다면 못풀었을 것 같다는 생각이 들었다.
func solution(_ n:Int, _ left:Int64, _ right:Int64) -> [Int] {
var result = [Int]()
for i in Int(left) + 1...Int(right) + 1 {
var row = i % n == 0 ? i / n : i / n + 1
result.append(i % n == 0 ? n : i % n <= row ? row : i % n)
}
return result
}
3. 다른 사람의 풀이
left와 right를 인덱스+1이라고 생각한 실수를 하지 않았다면 나도 이렇게 풀었을까? 생각이 든다. 논리는 같지만 나는 max를 떠올리지 못하고 대소관계로 풀었을 것 같긴하다. max를 잘 이용해봐야겠다!
func solution(_ n: Int, _ left: Int64, _ right: Int64) -> [Int] {
return (left...right).map { max(Int($0) / n, Int($0) % n) + 1 }
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv.2 피로도 문제 (0) | 2024.04.16 |
---|---|
[프로그래머스] Lv.2 괄호 회전하기 문제 (0) | 2024.04.13 |
[프로그래머스] Lv.2 예상 대진표 문제 (0) | 2024.04.11 |
[프로그래머스] Lv.2 N개의 최소공배수 (0) | 2024.04.11 |
[프로그래머스] Lv.2 귤 고르기 문제 (0) | 2024.04.11 |