프로세스
풀이
문제를 어떻게 해결할까 하다가 일단 큐로 풀어야 하는 방법이긴 하니까 큐의 방식을 이용해서 front와 rear를 설정해 주고 이를 이용해 줬다.
- 실행될 때, turn_number라는 변수를 이용해 내가 몇 번째 실행됐는지 기록한다.
- front와 rear를 비교했을 때, 남은 프로세스가 1개면, 그 프로세스를 실행시켜 준다.
- 1이 아니라면, 내 뒤에 나보다 우선순위가 높은 프로세스가 있는지 확인한다.
2-1. 만약 있으면, 나를 맨 뒤로 보내면서, front와 rear도 +1 하면서 한 칸 뒤로 무른다.
2-2. 만약 없다면, 내가 실행되야 하니, rear는 그대로 front만 +1 - 1과 2를 반복하면서 내가 찾으려는 인덱스인데 실행을 못하면 rear+1의 값으로 재설정해주고, 실행한다면 거기서 while문을 종료시키고 turn_number를 반환한다.
def solution(priorities, location):
answer = 0
find_where = location
front = 0
rear = len(priorities)-1
turn_number = 0
# while문을 이용해 지금 작동해야할 것이 아니라면, 맨 뒤로 보내버리기
while front <= rear:
# 남은 갯수가 1 초과 일때 확인
if len(priorities[front:]) > 1:
# 우선순위가 높은 프로세스가 뒤에있으면, 난 다시 줄서기
if priorities[front] < max(priorities[front+1:]):
priorities.append(priorities[front])
# 실행 순서를 확인하려고 하는 인덱스에 해당된거면, rear+1에 위치함을 인지
if find_where == front:
find_where = rear + 1
front += 1
rear += 1
# 나보다 우선순위가 높은 프로세스가 뒤에 없으면, 내가 실행
else:
turn_number += 1
# 내가 찾고 있는 프로세스라면 탐색 종료.
if find_where == front:
break
front += 1
# 남은 갯수가 1이면, 해당 프로세스가 실행될 차례
else:
turn_number += 1
front += 1
return turn_number
다른 사람 풀이
아래 2가지 방법이 꽤 많은 사람들이 이용했다.
1번째 방법.
def solution(priorities, location):
queue = [(i,p) for i,p in enumerate(priorities)]
answer = 0
while True:
cur = queue.pop(0)
if any(cur[1] < q[1] for q in queue):
queue.append(cur)
else:
answer += 1
if cur[0] == location:
return answer
조금 더 자세히 보면,
queue = [(i,p) for i,p in enumerate(priorities)]
위의 코드를 이용해서 우선순위와 인덱스를 동시에 저장한 리스트를 만들어내어 효과적으로 관리하였다.
if any(cur[1] < q[1] for q in queue):
이 코드를 이용해서 현재 프로세스의 우선순위를 다른 우선순위보다 낮은지 확인하였다.
낮지 않다면, 우선 실행시켜서 실행순서 += 1 해주고, 인덱스가 우리가 찾고 있는 인덱스와 동일하다면 답을 출력시킨다.
2번째 방법.
def solution(p, l):
ans = 0
m = max(p)
while True:
v = p.pop(0)
if m == v:
ans += 1
if l == 0:
break
else:
l -= 1
m = max(p)
else:
p.append(v)
if l == 0:
l = len(p)-1
else:
l -= 1
return ans
이 방법은 내 방법과 유사하다고 볼 수 있을 듯하다.
다만 pop()을 쓰면서 관리를 하였다.
프로세스 중 가장 우선순위가 높은 값을 먼저 구한다. 그리고 프로세스를 실행하면서, 먼저 pop()을 이용해서 v변수에 입력하고 이와 같으면 실행하고 새로운 max값을 구하고, 아니면 이를 맨 뒤에 추가하는 식으로 하면서 같이 내가 관리해야 하는 l 즉, 인덱스의 값 도한 이동시키면서 몇 번째에 실행될지를 확인해주고 있다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 Lv2 N개의 최소공배수 (python) (1) | 2024.01.31 |
---|---|
프로그래머스 Lv2 기능개발 (python) (0) | 2024.01.31 |
프로그래머스 Lv2 구명보트 (python) (1) | 2024.01.30 |
프로그래머스 Lv1 [1차] 다트 게임 (python) (0) | 2024.01.30 |
프로그래머스 Lv1 부족한 금액 계산하기 (python) (1) | 2024.01.30 |