👉 사용 언어 : 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
- 리턴값
- 해당 프로세스가 몇 번째로 실행되는지❗️
👉 아이디어
- 우선 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값의 현재 인덱스를 저장한다.
- 작은 경우 : pop()한 후, 다시 배열 맨 끝에 추가 한다.
✅ 다른 사람 풀이 참고
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 |