Swift. 프로그래머스-프로세스

Choooose·2023년 5월 22일
0

알고리즘 풀이

목록 보기
1/1

프로그래머스 - 프로세스

문제 설명

운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다.

1. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.

예를 들어 프로세스 4개 [A, B, C, D]가 순서대로 실행 대기 큐에 들어있고, 우선순위가 [2, 1, 3, 2]라면 [C, D, A, B] 순으로 실행하게 됩니다.

현재 실행 대기 큐(Queue)에 있는 프로세스의 중요도가 순서대로 담긴 배열 priorities와, 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location이 매개변수로 주어질 때, 해당 프로세스가 몇 번째로 실행되는지 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • priorities의 길이는 1 이상 100 이하입니다.
    • priorities의 원소는 1 이상 9 이하의 정수입니다.
    • priorities의 원소는 우선순위를 나타내며 숫자가 클 수록 우선순위가 높습니다.
  • location은 0 이상 (대기 큐에 있는 프로세스 수 - 1) 이하의 값을 가집니다.
    • priorities의 가장 앞에 있으면 0, 두 번째에 있으면 1 … 과 같이 표현합니다.

예시

prioritieslocationreturn
[2, 1, 3, 2]21
[1, 1, 9, 1, 1, 1]05

풀이

단순히 p(priorities)의 가장 큰 값과 0번째 인덱스 ( 왼쪽 값 ) 을 비교하여 같다면 (우선순위가 높은 값 = 왼쪽 값 ) 제거하고 카운트를 높여준다.

아니라면 마찬가지로 제거하고 p의 맨 끝에 삽입한다.


이때 location을 고려해야한다.

location 번째의 프로세스가 다른 프로세스들의 실행 및 삭제 후 뒤로 삽입 등의 영향으로 인해 계속해서 인덱스가 바뀌게 되므로
location을 프로세스의 변동 시에 같이 움직이거나 p를 각 location을 가진 튜플로 만드는 방법이 있을 것 같았다.

나는 전자를 사용했고 따라서 작업이 실행되거나 뒤로 삽입될 때마다 location을 -1 해주었다

여기서 location번째 프로세스의 실행 여부에 따라 location의 값이 달라진다.

  • 실행될때의 location 값은 0 보다 작으므로 0보다 작은 경우 break를 해주면 된다.
  • 만약 아니라면 location 값이 0보다 작은 경우는 p의 맨 뒤로 다시 삽입되는 경우 이므로 p의 마지막 인덱스번째를 location 값으로 지정한다.

구상 결과 이러한 의사코드가 나오게 되었고

이를 swift 코드로 구현하면

func solution(_ priorities:[Int], _ location:Int) -> Int {
    var p = priorities
    var result = 0
    var location = location 
    while p.count != 0 {
        location -= 1
        let max = p.max()!
        let l = p[0]
        if l != max {
            p.append(l)
            p.removeFirst()
            if location < 0 { location = p.count - 1}
        }
        else {
            result += 1
            p.removeFirst()
            if location < 0 { break }
        }
    }
    return result
}

위와 같이 나오게 된다.

채점 결과 성공인 것을 볼 수 있으나

swift의 removeFirst() 메소드는 배열의 첫번째 원소를 삭제하고 다시 재정렬하는 과정에서 배열의 길이에 따라 시간이 소모된다.

따라서 removeFirst()를 사용하는 것이 아닌 idx변수를 만들어 가장 왼쪽을 실행하는 것이 아닌 idx번째의 변수를 실행하도록 했다.

실행 후에는 삭제가 아닌 0으로 만들어 max가 되지 않도록 하였고 실행할 idx가 움직이므로 location을 따로 -1 할 필요없이
(removeFirst() 를 하지 않으므로 location의 변화가 없다 )

locationidx가 같아질 때를 조건으로 변경하였다.

func solution(_ priorities:[Int], _ location:Int) -> Int {
    var p = priorities
    var result = 0
    var (location, idx) = (location, 0)
    while p.count != 0 {
        let max = p.max()!
        let l = p[idx]
        if l != max {
            p.append(l)
            p[idx] = 0
            if location == idx { location = p.count - 1}
        }
        else {
            result += 1
            p[idx] = 0
            if location == idx { break }
        }
        idx += 1
    }
    return result
}

0개의 댓글