운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다.
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 … 과 같이 표현합니다.priorities | location | return |
---|---|---|
[2, 1, 3, 2] | 2 | 1 |
[1, 1, 9, 1, 1, 1] | 0 | 5 |
단순히 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
의 변화가 없다 )
location
과 idx
가 같아질 때를 조건으로 변경하였다.
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
}