-
프로그래머스> 스택/큐> 프린터ALGORITHM/Programmers 2020. 6. 25. 08:25728x90
<문제링크: https://programmers.co.kr/learn/courses/30/lessons/42587>
문제설명: priorities 리스트에 인쇄 요청이 들어온 문서들의 중요도가 나열되어 있고, 이 중 location 위치에 있는 문서가 맨 앞으로 와서 pop할 때의 순서를 반환해야 한다. 즉, location 위치의 문서가 맨 앞에 오고 그 중요도가 priorities 의 숫자들 중 가장 클 때까지 pop과 append를 적절히 반복해주면서 순서를 count해주면 된다.
[1차 시도]
def solution(priorities, location): answer = 0 i = 0 while len(priorities)!=1: front = priorities.pop(0) if max(priorities) > front: priorities.append(front) else: answer+=1 if i == location: break i+=1 return answer
풀이: while반복문으로 priorities에 숫자 1개가 남을 때까지, 앞에서부터 차례로 pop하면서 뒤에 더 큰 숫자가 있다면, 다시 리스트에 append해서 맨 뒤로 보낸다. 만약 pop한 숫자(중요도)가 제일 높다면 answer를 1씩 증가시킨다. 이렇게 반복하면서 현재 반복횟수가 location의 위치까지 갔음을 표시하기 위해 두 가지 경우 다 반복 순서(i)를 1씩 증가시키고, 해당 반복 횟수가 location가 일치한다면 break로 반복문을 종료한다.
채첨 결과: 테스트케이스 20개 중 7개만 맞았다.
해결방법: 이렇게 하면 location이 0일 때는 i를 증가시키는 것이 의미가 없다.
예를 들어 [1,2,3]에서 1을 보고자 할 때, 순서는 [2,3,1] -> [3,1,2](+1) -> [1,2] -> [2,1](+1) -> [1](+1) 이므로 답은 3이 나와야 하지만, 위와 같은 방법으로는 마지막 [1]이 남았을 때 answer의 값은 2이므로 2가 반환된다.
따라서 정확한 인덱스를 같이 가지고 가기 위해 빈 배열을 만들어서 인덱스와 값을 같이 저장해주었다.
[2차 시도]
def solution(priorities, location): answer = 0 bin = [] for idx, val in enumerate(priorities): bin.append((idx,val)) while bin: idx,val = bin.pop(0) if max(priorities) > val: bin.append((idx,val)) else: answer+=1 priorities.remove(val) if idx == location: break return answer
풀이: 처음부터 빈 배열을 만들어 priorities의 인덱스와 값을 1쌍의 튜플로 넣어주었다. bin 배열이 남아있을 때까지 while 반복문을 돌려 앞에서부터 pop한 값보다 priorites배열에 더 큰 값이 있는지 판별한다. 만약 있다면 현재 pop한 값을 다시 append해서 대기목록에 넣어주고, 없다면 순서를 의미하는 answer를 1씩 증가시킨다. 그리고 해당 문서가 출력이 됐으므로, priorities배열에서 제거를 해주어야 한다. 다음으로 현재 pop한 튜플에 들어있는 idx(인덱스)가 찾고자하는 location과 일치한다면, break를 걸어 종료시킨다.
채첨결과: 정확성, 효율성 모두 정상적으로 잘 통과한다.
'ALGORITHM > Programmers' 카테고리의 다른 글
코딩테스트 연습> 연습문제> 핸드폰 번호 가리기 (0) 2020.07.01 코딩테스트 연습> 해시> 완주하지 못한 선수 (0) 2020.06.29 코딩테스트 연습> 연습문제> 2016년 (0) 2020.06.28 프로그래머스> 해시> 위장 (0) 2020.06.26 프로그래머스> 해시 > 전화번호 목록 (0) 2020.06.24