본문 바로가기
알고리즘/프로그래머스

프로그래머스 Lv2 프로세스(python)

by 개발하는 호랑이 2024. 1. 30.

프로세스

풀이

문제를 어떻게 해결할까 하다가 일단 큐로 풀어야 하는 방법이긴 하니까 큐의 방식을 이용해서 front와 rear를 설정해 주고 이를 이용해 줬다.

  1. 실행될 때, turn_number라는 변수를 이용해 내가 몇 번째 실행됐는지 기록한다.
  2. front와 rear를 비교했을 때, 남은 프로세스가 1개면, 그 프로세스를 실행시켜 준다.
  3. 1이 아니라면, 내 뒤에 나보다 우선순위가 높은 프로세스가 있는지 확인한다.
    2-1. 만약 있으면, 나를 맨 뒤로 보내면서, front와 rear도 +1 하면서 한 칸 뒤로 무른다.
    2-2. 만약 없다면, 내가 실행되야 하니, rear는 그대로 front만 +1
  4. 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 즉, 인덱스의 값 도한 이동시키면서 몇 번째에 실행될지를 확인해주고 있다.