[Swift] 프로그래머스 기능개발(lv. 2)
1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/42586
2. 접근
몇 일 째에 무슨 기능이 배포가 되는 것이 중요한 것이 아니고 '어떤 날에' 배포되는 기능의 '수'를 찾아내야 한다.
주어진 progresses를 100에서 뺀 수를 speeds로 나누면 남은 날이 나올 것이다. 만약 나누어 떨어지지 않으면 하루 더 걸리는 것이고. 이런 생각을 구현해보기 위해 progressingDay 라는 배열을 만들어서 progresses를 map 함수를 이용하여 각 기능 출시에 남은 날들을 담을 수 있게 하였다. i는 인덱스로 활용하기 위해 만들어 두었다.
그런 다음, '앞에 것이 완료가 안 되면 뒤는 완료가 돼도 출시가 안 되고 한 꺼번에 된다'는 점이 stack의 형상이었다.
progressingDay의 원소가 들어가서 그 수보다 더 큰 수가 들어오기 전까지 원소들을 쌓다가, 더 큰 수가 들어오면 현재 스택에 쌓여있는 원소의 개수를 정답 배열에 넣고, 스택을 초기화하여 다시 원소를 쌓고,, 반복을 하면 함께 출시되는 기능의 수를 셀 수 있을 것이라고 생각하였다.
스택이 빈 경우에는 progressingDay의 원소를 스택에 집어넣고, 그렇지 않은 경우 현재 가장 위에 위치한 원소와 비교하여 들어올 수가 맨 위의 수보다 작은 경우에는 계속 스택에 쌓고, 큰 경우에는 그 원소의 개수를 세서 정답 배열에 넣고 원소를 초기화시켜 준 후 그 원소를 다시 쌓아준다.
이런식으로 풀이를 진행하였다.
3. 코드
import Foundation
func solution(_ progresses:[Int], _ speeds:[Int]) -> [Int] {
var i = 0
let progressingDay: [Int] = progresses.map({ key in
if (100 - key) % speeds[i] == 0 {
let temp = (100 - key) / speeds[i]
i += 1
return temp
} else {
let temp = (100 - key) / speeds[i] + 1
i += 1
return temp
}
})
var answer = [Int]()
var stack = [Int]()
for i in progressingDay {
if stack.isEmpty {
stack.append(i)
} else {
if stack[0] >= i {
stack.append(i)
} else {
answer.append(stack.count)
stack = [Int]()
stack.append(i)
}
}
}
answer.append(stack.count)
return answer
}
'Problem Solving' 카테고리의 다른 글
[Swift] 프로그래머스 프린터(lv. 2) (0) | 2023.03.27 |
---|---|
[Swift] 프로그래머스 주차 요금 계산(lv. 2) (0) | 2023.03.25 |
[Swift] 프로그래머스 튜플(lv. 2) (0) | 2023.03.23 |
[Swift] 프로그래머스 위장(lv. 2) (0) | 2023.03.22 |
[Swift] 프로그래머스 행렬의 곱셈(lv. 2) (0) | 2023.03.21 |
댓글