본문 바로가기

코딩 테스트/프로그래머스

[Python] 프로그래머스 lv.2 프로세스

알고리즘 고득점 kit - 스택/큐 - lv 2

 

문제 분석

  • 운영체제 규칙에 따라 프로세스가 관리될 경우 특정 프로세스가 몇 번째로 실행되는가 
  • 큐 : First In First Out
  • 큐에서 대기중인 프로세스 하나를 꺼냄
  • 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣음
  • 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스 실행 - 다시  큐에 안들어가고 종료
  • 입력값 : 중요도가 순서대로 담긴 배열 priorities, 몇 번째로 실행되는지 알고싶은 프로세스 위치 location

 

코드 설계

  • location 과 같은 숫자가 pop 되면 그때의 순서(answer)를 return
  • 맨 앞의 큐를 꺼내고, 해당 인덱스 저장
  • 만약 꺼낸 큐의 값이 큐 안에 있는 숫자들 중 가장 작다면 continue
  • 큐 안의 다른 값이 더 작다면 (우선순위가 더 높은 갚이 큐 안에 있다면) append
  • 만약 다시 append 되지 않고 실행종료되었다면 answer += 1

 

정답 코드

실패..

from collections import deque
def solution(priorities, location):
    answer = 0
    priorities = deque(priorities)

    while priorities: # 다 꺼내면 종료
        process = priorities.popleft()
        idx = 0
        for i in range(len(priorities)):
            if priorities[i] < process :
                priorities.append(process)
                idx = (idx+1)%len(priorities)
            else :
                continue
        answer += 1
        if process == location :
            return answer

 

다른 사람 코드 1 - deque

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

 

다른 사람 코드 2

def solution(priorities, location):
    queue = [(i,p) for i,p in enumerate(priorities)] # enumerate을 이용하여 (index, process) 튜플 리스트 생성
    answer = 0
    while True :
        current = queue.pop(0)
        if any(current[1] < q[1] for q in queue) : # 큐 내 더 높은 우선순위의 프로세스가 존재하는지 파악
            # any 대신 max도 사용 가능
            queue.append(current)
        else :
            answer += 1
            if current[0] == location:
                return answer

 

다른 사람 코드 3

def solution(priorities, location):
    answer = 0
    search, c = sorted(priorities, reverse=True), 0
    while True:
        for i, priority in enumerate(priorities):
            s = search[c]
            if priority == s:
                c += 1
                answer += 1
                if i == location:
                    break
        else:
            continue
        break
    return answer

 

2회차 - 2024.11.27

문제 분석

  1. 실행대기 큐에서 대기중인 프로세스 하나를 꺼냄
  2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣음
  3. 만약 꺼낸 프로세스의 우선순위가 가장 높다면 해당 프로세스 실행 (실행된 프로세스는 종료)

 

코드 설계

  • 맨 앞 하나를 꺼냄
  • 우선순위가 높아 실행
    • 삭제 :  찾는 위치의 인덱스도 앞으로 땡겨짐 : location -1
      • 삭제된 값이 찾는 인덱스가 아니였다면 (location != 0) : answer += 1
      • 삭제된 값이 찾는 인덱스였다면 (location == 0) : break // 더 이상 계산할 필요x
  • 더 높은 우선순위 프로세스가 이후에 있어 실행되지 않음
    • 맨 뒤로 보냄
      • 맨 뒤로 보낸 값이
      • 찾는 인덱스가 아니였다면 (location != 0) : location -1
      • 찾는 인덱스였다면 (location == 0) : location을 현재 priorities를 현재 리스트의 길이-1로 업데이트 

 

정답 코드

def solution(priorities, location):
    answer = 0

    while priorities:
        process = priorities[0]
        if process >= max(priorities):  # 우선순위가 가장 낮아 종료하는데
            del priorities[0]
            answer += 1  # 한턴이 아니라 삭제 == 실행 : 몇번째로 실행되는가

            if location == 0:  # 만약 종료한게 찾으려는 순서였다면
                break  # answer를 더 이상 안 구하고 빠져나와서 return

        else:  # 맨 뒤로 보내기
            del priorities[0]
            priorities.append(process)

            # 근데 찾는 위치였으면 location 값 바꾸기
            if location == 0:
                location = len(priorities) - 1
                continue  # 값 조정 했으니 -1 하면 x

        location -= 1  # 어쨌든 앞에서 사라졌으니 -1

    return answer