[Swift] [36일차] 기능개발

·2025년 1월 12일
0

SwiftAlgorithm

목록 보기
39/105
post-thumbnail

programmers-기능개발

문제 설명

  1. 현재 진행도랑 각 작업이 하루에 얼만큼 진전되는지 배열 제공
  2. 앞에서부터 배포를 하는데, 뒤에있는애가 먼저 완성되면 앞에랑 같이 배포
  3. 하루에 몇개씩 뭉쳐서 배포되는지 개수를 return

문제 접근

  1. 하루에 얼마 걸리는지로 각 작업이 몇일 걸리는지 파악할 수 있으니까 그걸로 날짜별로 짤라주면될 것 같기도 ??

문제 풀이

  1. perdays_list로 각 작업이 몇일 걸리는지 배열을 따로 만들어주고,
  2. 그 다음에 이제 스택에 담아서 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에서 {}클로저는 정의될 때 실행이 안되고 호출해야 실행되는거라서 ;로 실행문 구분을 해주고 끝났으면 클로저를 닫은다음에 ()로 호출을 해주면 정상적으로 원하는대로 실행이 될 것이다.

swift-closures공식문서

profile
기억보단 기록을

0개의 댓글