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]
'Swift랑 친해지기 > programmers 풀기' 카테고리의 다른 글
[프로그래머스] 할인 행사 (Swift) (0) | 2022.12.11 |
---|---|
[프로그래머스] 귤 고르기 (Swift) (0) | 2022.12.09 |
[프로그래머스] 소수 찾기(Swift) (2) | 2022.12.07 |
[프로그래머스] 튜플 (Swift) (0) | 2022.12.06 |
[프로그래머스] 위장 (Swift) (0) | 2022.12.05 |