알고리즘
[알고리즘] 프로그래머스 - 프로세스
발등이 따뜻한 사람
2024. 1. 3. 18:54
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42587
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
정말 그냥 문제에 나와있는대로 하면 된다.
1. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.
큐니까 선입된(가장 왼쪽) 프로세스를 꺼내고, 다시 큐에 넣을땐 맨 오른쪽으로 넣어주면 된다.
옛날에 풀었던 적이 있는 문제인데, 그 당시에 프로세스를 뺀 다음 실행 대기 큐에서 가장 우선순위가 높은 프로세스를 찾을 때 sorted함수를 썼어서 그런지 시간복잡도는 예전 코드가 더 높더라. 아이디어는 고만고만하지만 ㅠ 지금 다시 푼게 시간복잡도가 더 낮아져서 기분이 좋았다...
정답 코드
이번 풀이
from collections import deque
def solution(priorities, location):
answer = 1
priorities = [(idx,value) for idx,value in enumerate(priorities)]
q = deque(priorities)
while q:
idx,item = q.popleft()
if not q:
return answer
max_num = max([i[1] for i in q])
if item < max_num:
q.append((idx,item))
else:
if idx == location:
break
else:
answer += 1
return answer
저번 풀이
from collections import deque
def solution(priorities, location):
answer = 0
priorities = deque([(i,v) for i,v in enumerate(priorities)])
cnt=0
# print(priorities)
while len(priorities)>0:
tmp_pri=sorted(priorities,reverse=True, key=lambda x : x[1])
if priorities[0][1] != tmp_pri[0][1]:
tmp_num=priorities.popleft()
priorities.append(tmp_num)
else:
tmp_num=priorities.popleft()
cnt+=1
if tmp_num[0]==location:
return cnt
# print(priorities)
return answer