알고리즘 고득점 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
문제 분석
- 실행대기 큐에서 대기중인 프로세스 하나를 꺼냄
- 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣음
- 만약 꺼낸 프로세스의 우선순위가 가장 높다면 해당 프로세스 실행 (실행된 프로세스는 종료)
코드 설계
- 맨 앞 하나를 꺼냄
- 우선순위가 높아 실행
- 삭제 : 찾는 위치의 인덱스도 앞으로 땡겨짐 : location -1
- 삭제된 값이 찾는 인덱스가 아니였다면 (location != 0) : answer += 1
- 삭제된 값이 찾는 인덱스였다면 (location == 0) : break // 더 이상 계산할 필요x
- 삭제 : 찾는 위치의 인덱스도 앞으로 땡겨짐 : location -1
- 더 높은 우선순위 프로세스가 이후에 있어 실행되지 않음
- 맨 뒤로 보냄
- 맨 뒤로 보낸 값이
- 찾는 인덱스가 아니였다면 (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
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[Python] 프로그래머스 lv.0 접미사인지 확인하기 (0) | 2024.10.20 |
---|---|
[Python] 프로그래머스 lv.0 접미사 배열 (0) | 2024.10.20 |
[Python] 프로그래머스 lv.2 올바른 괄호 (0) | 2024.10.15 |
[Python] 프로그래머스 lv.2 기능개발 (0) | 2024.10.15 |
[Python] 프로그래머스 lv.2 주식가격 (1) | 2024.10.15 |