문제 설명
- 현재 진행도랑 각 작업이 하루에 얼만큼 진전되는지 배열 제공
- 앞에서부터 배포를 하는데, 뒤에있는애가 먼저 완성되면 앞에랑 같이 배포
- 하루에 몇개씩 뭉쳐서 배포되는지 개수를 return
문제 접근
- 하루에 얼마 걸리는지로 각 작업이 몇일 걸리는지 파악할 수 있으니까 그걸로 날짜별로 짤라주면될 것 같기도 ??
문제 풀이
perdays_list
로 각 작업이 몇일 걸리는지 배열을 따로 만들어주고,- 그 다음에 이제 스택에 담아서 stack의 최상단과 비교를 해주고, 그거보다 작으면 stack에 포함, 그것보다 크면 이제 스택을 다시 리셋해주는 방식으로 진행을 했다.
import Foundation
func solution(_ progresses: [Int], _ speeds: [Int]) -> [Int] {
var perdays_list = Array(repeating: 0, count: progresses.count)
var stack = [Int]()
var answer = [Int]()
for idx in 0 ..< progresses.count {
perdays_list[idx] = Int(ceil(
Double(100 - progresses[idx]) / Double(speeds[idx])
))
}
for item in perdays_list {
if stack.isEmpty {
stack.append(item)
}
else {
stack.last! >= item ? stack.append(item) : { answer.append(stack.count); stack = [item] }()
}
}
answer.append(stack.count)
return answer
}
채점 결과
정확성: 27.3
합계: 27.3 / 100.0
예제도 맞고 잘 작성했다고 생각했는데 3개빼고 다 틀리게 나왔다 왜지? 싶었다.
해결
stack.last! >= item ? stack.append(item) : { answer.append(stack.count); stack = [item] }()
이부분이 문제였는데,
stack.last!
를 하면 안되고stack.first!
를 해줘야한다. 기준이 되는 최상단은first!
이기 때문!
최종코드
import Foundation
func solution(_ progresses: [Int], _ speeds: [Int]) -> [Int] {
var perdays_list = Array(repeating: 0, count: progresses.count)
var stack = [Int]()
var answer = [Int]()
for idx in 0 ..< progresses.count {
perdays_list[idx] = Int(ceil(
Double(100 - progresses[idx]) / Double(speeds[idx])
))
}
for item in perdays_list {
if stack.isEmpty {
stack.append(item)
}
else {
stack.first! >= item ? stack.append(item) : { answer.append(stack.count); stack = [item] }()
}
}
answer.append(stack.count)
return answer
}
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
타인의코드
import Foundation
func solution(_ progresses:[Int], _ speeds:[Int]) -> [Int] {
var lastReleaseDate: Int = 0
var numOfReleases: [Int] = []
for i in 0..<progresses.count {
let progress = Double(progresses[i])
let speed = Double(speeds[i])
let day = Int(ceil((100 - progress) / speed))
if day > lastReleaseDate {
lastReleaseDate = day
numOfReleases.append(1)
} else {
numOfReleases[numOfReleases.count - 1] += 1
}
}
return numOfReleases
}
풀이는 전체적으로 거의 동일한 것 같고, 저 처럼 따로
perdays_list
즉, 이 얼만큼 걸리는지에 대한 배열을 그때그때 만들어주냐, 미리 만들고 들어가느냐 차이정도인 것 같다.
stack.first! >= item
? stack.append(item)
: { answer.append(stack.count); stack = [item] }()
이번에 이렇게 삼항 연산자를 사용할 때 로직을 하나 이상, 즉 {}
로 감싸줘야하는 상황에 대해서 어떻게 처리를 해줘야하나 했는데 다음과같이 {}
클로저 바깥에 ()로 호출을 해줘야 정상적으로 실행이 됨을 알게 되었다.
swift에서 {}
클로저는 정의될 때 실행이 안되고 호출해야 실행되는거라서 ;
로 실행문 구분을 해주고 끝났으면 클로저를 닫은다음에 ()로 호출을 해주면 정상적으로 원하는대로 실행이 될 것이다.