반응형
문제 설명
프린터에서 지정한 작업이 몇번째로 출력되는지 알아내야한다.
리스트에서 가장 큰 숫자가 먼저 프린트 되고 하나씩 왼쪽으로 밀린다.
먼저, 현재 List에서 최대값을 알아내야한다. 이를 위해 max라는 함수를 구현.
list를 받아서 max값을 리턴한다. 시간복잡도는 O(n)
def max(lst):
mx=0
for i in lst:
if(i>mx):
mx=i
return mx
1) pop하는 요소의 값이 max이면 출력한다.
2) 해당 값이 우리가 출력하고 싶은 값(location)이라면, 결과(answer)를 출력하고 종료한다.
3) pop한 값이 max가 아니라면 --> 오른쪽 끝에 더하여 준다.
def solution(priorities, location):
answer=0
val = priorities[location] #출력물의 우선순위.
mx = max(priorities) #현재 시점의 최대값.
while True:
v = priorities.pop(0) # pop한 값.
if v==mx: #pop한 값이 max라면 출력한다.
answer+=1 # 출력했으므로 결과 값 +1
if location==0: # 위치가 0이라면 우리가 출력하고 싶은 값이 출력된 것이다.
break
mx = max(priorities)
else: #max값이 아니라면 오른쪽에 다시 넣어준다.
priorities.append(v)
## 위치는 한칸씩 왼쪽으로 가며, -1이 될 경우 오른쪽 끝으로 보낸다.
location-=1
if location<0:
location= len(priorities)-1
return answer
다른 사람 풀이.
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
enumerate
사용하면 몇 번째이고, 값이 무엇인지 한 번에 알 수 있다.
[(i,j) for i,j in enumerate(l)]
-->[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]
any → 현재 pop한 값보다 큰 값이 있는지 없는지 확인(max의 역할)
- iterable을 인자로 받고, 전체 리스트에서 true가 하나라도 있으면 true,
전부 false인 경우에만 false이다.
ㅣ=[1,2,3,4,5]
any([i<100 for i in l])
Out[9]: True
any([i>4 for i in l])# any([F,F,F,F,T])
Out[10]: True
any([i>5 for i in l]) # any([F,F,F,F,F])
Out[11]: False
반응형
'코딩 테스트' 카테고리의 다른 글
[LeetCode] 2. Add Two Numbers - Medium (0) | 2023.02.15 |
---|---|
[LeetCode] 1. Two Sum - Easy (0) | 2023.02.15 |
[프로그래머스] 디스크 컨트롤러 (0) | 2023.02.10 |
[코딩테스트] 프로그래머스 : 주식가격 (0) | 2022.12.05 |
[코딩테스트] 프로그래머스 : 위장, Counter 사용법 (0) | 2022.11.30 |
댓글