본문 바로가기

알고리즘풀이/프로그래머스

[Lv2.] 프로세스

👉 사용 언어 : PYTHON3

프로세스

✅ Solution

def solution(priorities, location):
    ans = 0
    idx_dict = {i : priorities[i] for i in range(len(priorities))}
    idx_dict = sorted(idx_dict.items(), key=lambda x: x[1], reverse=True)
    max_idx = -1
    while True:
        max_val = max(idx_dict, key=lambda x: x[1])
        idx = idx_dict.index(max_val)
        if max_val[0] < max_idx and len(max_val) < 3:
            idx_dict[idx] = max_val + ('T',)
            idx_dict.append(idx_dict.pop(idx))
        else:
            ans += 1
            if max_val[0] == location:
                break
            max_idx = max_val[0]
            idx_dict.pop(idx)
    return ans

 

👉 문제 설명 및 제한 사항

  • 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내는 문제
  • 규칙
    • 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
    • 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
    • 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
      • 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.
  • 예시
    • 실행 대기 큐 : 프로세스 4개 [A, B, C, D] 가 순서대로 들어있는 경우
    • 우선순위가 [2, 1, 3, 2] 라면❓ [C, D, A, B] 순으로 실행
  • 매개변수
    • 프로세스의 중요도가 순서대로 담긴 배열 priorities
      • 1 <= 길이 <= 100
      • 1 <= 원소 <= 9 정수
      • 원소는 우선순위를 나타내며 숫자가 클수록 우선순위가 높다.
    • 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location
      •  0 이상 (대기 큐에 있는 프로세스 수 - 1) 이하의 값
      • 가장 앞에 있으면 0, 두 번째에 있으면 1 … (= index)
  • 리턴값
    • 해당 프로세스가 몇 번째로 실행되는지❗️

👉 아이디어

  • 우선 priorities 배열의 원소(value)인덱스((key)를 맵핑하여 딕셔너리 를 생성한다.
  • 딕셔너리의 value를 기준으로 내림차순 정렬한다.
    • sorted()key 속성을 사용 ( lambda x: x[1] > value를 기준으로 정렬 )
    • 결과는 튜플 배열 형태 [(key1, value1), (key2, value2), ..., ]
  • 현재 원소(= 튜플)의 key max_idx보다 큰지❓ 작은지❓에 따라 실행문을 다르게 작성한다.
    • 작은 경우 : pop()한 후, 다시 배열 맨 끝에 추가 한다.
      • 이 때, 이미 한 번 pop한 원소를 구별하기 위해 해당 튜플에 'T' 추가 한다.
      • 조건에 len(max_val) < 3을 넣어 1번 pop했던 튜플은 제외하고 실행한다.
    • 큰 경우 : 몇 번째인지 카운트 한 후, max_idx업데이트 하고 배열에서 해당 원소(= 튜플) pop한다.
      • 만약 현재 원소의 key(= 인덱스) == location이라면, 반복문을 종료하고 카운트 변수를 리턴한다.
    • 앞에서 튜플 배열을 value에 대해 정렬 했지만, 이후에 pop하고 append하는 과정해서 정렬이 꼬이기 때문에 반복문을 돌릴때마다 max_val 변수 에는 현재 배열에서의 max값idx 변수 에는 그 max값의 현재 인덱스를 저장한다.

 

 다른 사람 풀이 참고

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

 

👉 깨달은 것 / 알게된 것

  • 정렬뿐만 아니라 max(), min()에서도 key속성을 사용할 수 있다.
  • enumerate를 사용하여 인덱스와 priorities 원소를 맵핑한 튜플 배열(= 큐)을 생성할 수 있다.
  • while문 안에서 break없이 바로 return ~ 하면 값을 리턴하고 실행을 종료한다.
  • max 대신 any 를 사용하여 풀이할 수 있다.
    • any() : 하나라도 True인게 있으면 True
    • 대소비교 를 할 때 사용하면 sort보다 실행시간을 많이 줄일 수 있다.
    • 매개변수로 iterable한 객체를 받는다.
    • Cf. all() : 모두 True여야 True 반환
  • any, all, max 모두 순회 가 일어나는 함수❗️

 

'알고리즘풀이 > 프로그래머스' 카테고리의 다른 글

[Lv2.] N개의 최소공배수  (0) 2024.03.05
[Lv2.] 모음사전  (0) 2024.03.01
[Lv2.] 영어 끝말잇기  (0) 2024.03.01
[Lv2.] 짝지어 제거하기  (0) 2024.02.28
[2/22] 기출문제 풀이  (0) 2024.02.20