본문 바로가기
알고리즘/프로그래머스

[프로그래머스] Lv.2 n^2 배열 자르기 문제

by 줍 2024. 4. 13.

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 }
}