본문 바로가기
Problem Solving

[Swift] 프로그래머스 기능개발(lv. 2)

by DuncanKim 2023. 3. 24.
728x90

[Swift] 프로그래머스 기능개발(lv. 2)

 

1. 문제

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

 

프로그래머스

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

programmers.co.kr

 

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
}
728x90

댓글