Python/Python 문제
프로세스
서영환
2024. 6. 27. 10:08
- 문제 설명
- 운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다.
- 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
- 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
- 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
- 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.
- 예를 들어 프로세스 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 … 과 같이 표현합니다.
- 입출력 예
- 실패코드
- 프로세스는 높은 순서대로 먼저 실행 되므로 일단 높은 순으로 정렬된 값이 필요
- 정렬되면서 앞의 값들은 뒤로 이동 하게 되므로 그 이동 순서를 기억
- 마지막으로 선택된 값의 위치를 찾기
- 위의 순서대로 코드를 작성 했으나 왜 실패 한지 이유를 잘모르겠음
def solution(priorities, location):
answer = 0
#높은 순으로 된 배열을 생성
sort_priorties = priorities.copy()
sort_priorties.sort(reverse = True)
#자리 이동 카운트
moves = 0
for index,maxValue in enumerate(sort_priorties):
#높은 순으로 정렬된 값이 앞으로 오도록 수정 하고 뒤로 간 만큼 자리이동 카운트
while priorities[index] != maxValue:
check = priorities[index]
priorities.pop(index)
priorities.append(check)
moves += 1
if location == 0 and moves > 0 : answer = len(priorities) - moves #선택된 자리가 0이고 이동카운트가 있으면 전체 길이에서 moves를 빼기
elif moves == 0 : answer = location #이동카운트가 0이면 location을 그대로 이므로 location 넣기
elif location - moves < 0: answer = len(priorities) + (location - moves) #location을 이동카운트가 에 뺀 값이 0보다 작아진다는 것은 배열의 끝으로 이동한 것이므로 배열의 전체 길이를 더하기
else : answer = location - moves #location을 이동카운트가 에 뺀 값이 0이 아니라면 앞으로 이동한 것이므로 그값을 answer에 넣기
return answer+1 #자리가 0부터이나 순서는 1부터이므로 최종적으로 1을 더해주기
- 실패코드에서 통과된 테스트들
- [2, 1, 3, 2] ,2, return 1
- [1, 1, 9, 1, 1, 1], 0 , return 5
- [2, 1, 3, 2], 1 , return 4
- [1, 1, 1, 1, 1, 1], 3 , return 4
- [2, 3, 3, 2, 9, 3, 3] ,3 , return 6
- 질문하기 반례
- [1, 2, 3, 4, 5], 2, return 3
- 딕셔너리를 이용하여 해당 부분을 처리 했으나 아직도 2~4, 6~8, 11~13, 16~20 번 테스트들에서 실패
def solution(priorities, location):
answer = 0
if min(priorities) == max(priorities) : return location + 1
dicts = {}
for index,pri in enumerate(priorities):
dicts[index] = pri
#높은 순으로 된 배열을 생성
sort_priorties = priorities.copy()
sort_priorties.sort(reverse = True)
for index,maxValue in enumerate(sort_priorties):
for key,value in dicts.copy().items():
if maxValue > value :
del dicts[key]
dicts[key] = value
elif maxValue == value : break
else: continue
for key in dicts.keys():
if key == location : break
answer += 1
return answer + 1
- 오류 수정 반례
- [2, 3, 3, 2, 9, 3, 3] ,3 , return 6
- 기존 수정 코드의 경우 뒤에 부분을 검사하지 않도록 했으나 그럴 경우
- [9,3,3,2,3,3,2]로 된 딕셔너리 값만 처리하게 된다
- 이를 방지 하기 위하여 임의 변수 k를 선언하여 정렬되어 있는 앞부분은 건너띄고 뒤의 값들만 가지고 다시 정렬하게 하여 정상적으로 동작 됨을 확인
def solution(priorities, location):
answer = 0
if min(priorities) == max(priorities) : return location + 1
dicts = { index : pri for index,pri in enumerate(priorities)}
#높은 순으로 된 배열을 생성
sort_priorties = priorities.copy()
sort_priorties.sort(reverse = True)
for index,maxValue in enumerate(sort_priorties):
k = 0
for key,value in dicts.copy().items():
if index <= k :
if maxValue > value :
del dicts[key]
dicts[key] = value
elif maxValue == value or key == location: break
else: continue
else:
k+=1
for key in dicts.keys():
if key == location : break
answer += 1
return answer + 1