Swift랑 친해지기/programmers 풀기

[프로그래머스] n^2 배열 자르기 (Swift)

데브킹덕 2022. 12. 8. 19:09

https://school.programmers.co.kr/learn/courses/30/lessons/87390

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

변수 설정

  • leftLine : n * n 행열 중 처음 시작하는 행의 위치
  • leftRow : n * n 행열 중 처음 시작하는 열의 위치
  • RightLine : n * n 행열 중 마지막에 위치한 행의 위치
  • RightRow : n * n 행열 중 마지막에 위치한 열의 위치
  • result : 결과 값 배열

 

내 풀이

1. 배열의 속성 찾기

  • [1-1] 배열의 행 (1이라고 가정)이 증가할수록 행의 개수가 1씩 증가

ex)

1

22

333

4444

 

  •  left와 right 범위안의 배열만 반환해야함 (모든 범위를 다 추가해서 removeSubrange로 삭제시 실행초과뜸..)
  •  left와 right를 n으로 나눈 몫은 행, 나머지는 열을 뜻함 (각각을 모두 상수로 저장했음)

 

2. 필요한 범위를 행을 기준으로 반복함

array는 행이 바뀔때마다 [1-1]의 조건을 갖는 배열을 가짐

for i in leftLine...rightLine{
    var array = Array(repeating: i + 1, count: i + 1)
}

 

3. 행에 비어있는 나머지 요소를 채워야함 

 

i + 2 부터 n의 범위의 수를 contentsOf를 이용해서 채워 줄것임

조건으로는 i+1이 n보다 작아야함

*이유는 n이 4이고 left는 3, right가 15라고 가정할때 i는 0부터 3까지 반복할텐데 4보다 크면 같으면 안되기 떄문임

if i+1 < n{
    let o = Array(i+2...n)
    array.append(contentsOf: o)
}

 

 

4. 필요한 행의 배열을 모두 채웠으면 열을 따져서 result에 추가해주면 됨

 

4-1) leftLine = RightLine : 좌측열 우측행의 범위만 반환하면 됨

4-2) leftLine == i : 좌측열부터 n-1(인덱스기 떄문)까지 result에 추가  

4-3) leftLine < i < rightLine : array배열을 모두 result에 추가

4-4) rightLine: 0번째 인덱스부터 우측열까지 result에 추가 후 반환

 

import Foundation

func solution(_ n:Int, _ left:Int64, _ right:Int64) -> [Int] {
    
    let leftLine = Int(left) / n //행
    let leftRow = Int(left) % n//열
    let rightLine = Int(right) / n //행
    let rightRow = Int(right) % n //열
    
    var result = [Int]()
    
    for i in leftLine...rightLine{
        var array = Array(repeating: i + 1, count: i + 1)
        
        if i+1 < n{
            let o = Array(i+2...n)
            array.append(contentsOf: o)
        }
        
        if leftLine == rightLine{
            return Array(array[leftRow...rightRow])
        }
        
        if i == leftLine{
            let p = Array(array[leftRow...n-1])
            result.append(contentsOf: p)
        }
        
        if i > leftLine && i < rightLine{
            result.append(contentsOf: array)
        }
        
        if i == rightLine{
            let q = Array(array[0...rightRow])
            result.append(contentsOf: q)
        }
        
    }
    
    return result
}

 

 

실패 코드 - (4~11만 통과)시간 초과 코드

 

무지성으로 배열에 모두 추가하고 앞뒤 범위를 잘라 줌

import Foundation

func solution(_ n:Int, _ left:Int64, _ right:Int64) -> [Int] {

    var sumArray = [Int]()
    var ele = 1

    while ele <= n{
        for i in 1...n{
            if i < ele{
                sumArray.append(ele)
            }else{
                sumArray.append(i)
            }
        }

        ele += 1
    }

    sumArray.removeSubrange(0...Int(left) - 1)
    sumArray.removeSubrange(Int(right) + 1 - Int(left)...sumArray.count-1)

    return sumArray
}

solution(3,2,5) //[3,2,2,3]