알고리즘 - 프로그래머스 기능개발 (Swift)

2020. 8. 4. 09:49Algorism

반응형

참조 : 프로그래머스 알고리즘 기능개발 문제 (Swift) 

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 ��

programmers.co.kr

문제 요건 

1. 모든 작업은 speed의 배열의 진행율 만큼 하루에 1회식 완료 된다.
2. 앞의 작업이(선행 작업) 100%가 되었을 경우에만 배포할 수 있다.
3. 각 일별의 배포가 진행된 배포 갯수의 배열을 반환한다.

 

해결 순서

1. for문으로 progresses의 배열의 값을 speeds의 배열의 값으로 더하는 작업을 진행한다.
2. 완료율이 100이 되는 항목을 체크한다. (선행 작업이 100이 아닌 작업은 체크하지 않는다.)
3. 완료율이 100이 된 항목은 순환 배열에서 제거하고, 반환되는 배열에 완료된 항목의 개수를 추가한다.
4. 모든 작업이 100이 되었을 경우 반환한다.

 

먼저 변수를 2개 선언해주겠습니다.

var resultArr = [Int]()						// 반환 배열 (작업이 완료되어 배포된 갯수)
var arr = Array(zip(progresses, speeds))    // progresses 및 speeds의 배열을 한개의 변수에 선언

반환해야할 배포 갯수 배열을 선언해주고 for문 연산을 진행하기 위해서 

progresses 및 speeds배열을 zip 함수를 이용하여 한개의 변수로 합처줍니다.

 

 

그 이후 while문을 사용하여 모든 작업이 완료되기 전까지 순환루프를 진행해 줍니다.

while true {
    var isSuccess = true  // 앞의 작업이 선행이 완료되었는지 판단
    var successCount = 0  // 배포가 가능한 갯수

    ........
}

내부에 하루에 한번식 모두 speeds의 배열의 값만큼 증가를 시키는 작업에서

그날의 작업이 완료되어 배포가 가능한 갯수를 확인 하기 위해서 변수 2개를 선언해줍니다.

 

while true {
    var isSuccess = true
    var successCount = 0
	
    // 1일 1회식 speeds의 값만큼 progresses의 값을 증가 시킨다.
    for index in 0..<arr.count {
        arr[index].0 += arr[index].1
        
        // 현재 작업이 모두 완료되었는지 확인 & 앞의 작업이 완료 되었는지 확인
        if arr[index].0 >= 100 && isSuccess {
            successCount += 1
        } else {
            isSuccess = false
        }
    }

	// 하루에 배포가 가능한 갯수를 확인 하여 기존 배열에서 제거하고 반환될 배열에 갯수를 추가한다.
    if successCount != 0 {
        arr.removeSubrange(0..<successCount)
        resultArr.append(successCount)
    }

	// 모든 작업이 완료되었을 경우 while문을 종료하고 반환한다.
    if arr.count == 0 {
        return resultArr
    }
}

그이후 하루에 speeds의 값만큼 progresses의 값을 증가시켜주고

내부에서 오늘 배포가 가능한 갯수를 확인해줍니다. (현재 작업이 100이 아닐경우 배포 가능여부는 false로 변환하여 파악해줍니다.)

 

그 이후에 배포가능한 값을 for문에서 사용한 arr의 배열에서 제거해준뒤에 반환될 resultArr에 포함하여 줍니다.

 

이작업을 반복해주며 arr의 배열의 값이 0 (모든 작업이 완료 되었을 경우) while문을 종료한뒤 반환해주면 문제는 해결 됩니다.

 

 

 

전체 소스

import Foundation

func solution(_ progresses:[Int], _ speeds:[Int]) -> [Int] {
    
    var resultArr = [Int]()
    var arr = Array(zip(progresses, speeds))
    
    while true {
        var isSuccess = true
        var successCount = 0
        
        for index in 0..<arr.count {
            arr[index].0 += arr[index].1
            if arr[index].0 >= 100 && isSuccess {
                successCount += 1
            } else {
                isSuccess = false
            }
        }
        
        if successCount != 0 {
            arr.removeSubrange(0..<successCount)
            resultArr.append(successCount)
        }
        
        if arr.count == 0 {
            return resultArr
        }
    }
    
    return resultArr
}
반응형