문제 설명 현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.
- 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
- 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
- 그렇지 않으면 J를 인쇄합니다.
- 조건
- 현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.
- 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.
- location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.
priorities | location | return |
---|---|---|
[2, 1, 3, 2] | 2 | 1 |
[1, 1, 9, 1, 1, 1] | 0 | 5 |
모든 테스트를 통과한 풀이답안
def solution(priorities, location):
loc = [i for i in range(len(priorities))]
fnl_loc = []
while len(priorities) != 0:
if priorities[0] == max(priorities):
fnl_loc.append(loc.pop(0))
priorities.pop(0)
else:
priorities.append(priorities.pop(0))
loc.append(loc.pop(0))
print(fnl_loc)
print(loc)
return fnl_loc.index(location)+1
우선순위 값에서 max값이 첫 번째 위치에 없으면 pop하고 append해 리스트 끝으로 보낸다.
그리고 중복된 priorities 값이 존재할 수 있으므로 priorities 바뀐 값들의 index를 또한 변경해주어야한다.
priorities의 값의 index를 loc이라는 이름의 리스트에 넣어 max값이 첫 번째로 나올 때까지 index값의 위치를 변경한다.
그렇게 반복하다 만약 priorities의 첫 번째값이 max가 나오면 우선순위값이 내림차순일 것이다.
최종적으로 priorities = [3,2,1,1] , loc [2,3,0,1]
우리가 찾고있는 location=2의 값은 3이었고 현재 3의 위치는 첫 번째에 위치해 return 값은 1이다.
내가 실패한 코드
def solution(priorities, location):
answer = 0
fnl_loc = []
queue = [(i,j) for i,j in enumerate(priorities)]
while True:
if queue[0][1] == max(priorities):
break
elif queue[0][1] != max(priorities):
queue.append(queue.pop(0))
return [i for i,j in queue].index(location)+1
enumerate함수를 사용해 구하는 방식도 가능할 것 같아 시도했지만 time out이라는 결과가 나왔다.
짐작으로 for구문이 2번 존재하기 때문이 아닐까 생각했다.
그 부분을 해결하지 못한채 enumerate를 잘 활용한 다른 코드를 발견해 아래에 적어본다.
배울점이 많은 다른 사람 풀이 코드
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
흥미로웠던 점은 any라는 함수였다.
처음 보았는데 이렇게 사용할 수 있다는 것을 알게되어 코드를 하나하나 뜯어보기로 하였다.
dequeue라는 함수를 사용하면 시간복잠도가 더 빠르지만 안쓰고도 코딩을 할 수 있다는 점에 집중해보았다.
any는 인자중에 참값이 하나라도 있으면 True를 반환하는 함수이다.
그렇게 첫 번째 값과 두 번째 값을 비교해서 작으면 queue뒤에 append하도록 하였다.
아니라면 첫 번째 값의 index가 찾고있던 location과 같다면 answer를 return하는 코드였다.
dequeue함수가 기억이 나지않아 쓰지 못하더라도 이렇게 코드를 쉽고 간결하게 쓸 수 있으면 좋겠다.