알고리즘/프로그래머스

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

개발하는 호랑이 2024. 1. 30. 17:21

프로세스

풀이

문제를 어떻게 해결할까 하다가 일단 큐로 풀어야 하는 방법이긴 하니까 큐의 방식을 이용해서 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 즉, 인덱스의 값 도한 이동시키면서 몇 번째에 실행될지를 확인해주고 있다.