[Swift] [35일차] n^2 배열자르기

·2025년 1월 11일
0

SwiftAlgorithm

목록 보기
38/105
post-thumbnail

programmers-n^2 배열자르기

문제 설명

  1. 사진에 나온 것 처럼 인덱스에 맞게 숫자가 순차적으로 들어가고,
  2. 이 배열을 가로로 쫙 펼쳐서 1차원 배열로 만든다음에
  3. Left ... right 까지 잘라서 return하면 끝


문제 접근

  1. 문제 자체는 어렵지 않아보이는데 n이 n^7까지 있는거로 볼 때 시간초과를 유발하는 문제인 것 같다.

문제풀이

  1. 처음에는 matrix 만들어주고 했는데, 보니까 굳이 그럴 필요가 없어서 그것 조차 주석처리를 해줬다.
  2. 행,열 중 큰 값에 대해서 그 큰값+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
}

이렇게 제출했더니 막 1GB까지도 나오고, 시간초과가 마구떴다...


처음에는 그냥 최대한 이 left,right를 선별해서 하려고했는데, 이 내부 로직보다는 for문이 2개 도는거 자체가 무리인 것 같아서 좀 방향을 틀었다.

천천히 뜯어보면
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같은거 좀 더 자유롭게 쓸 수 있게 좀 더 익숙해져야겠다는 생각을 했다.

profile
기억보단 기록을

0개의 댓글