
import java.util.*;
class Solution {
public int solution(int[] priorities, int location) {
int answer = 1;
LinkedList<Integer> list=new LinkedList<>();
for(int n:priorities)
list.add(n);
while(true){
int num=list.poll();
boolean isPrinted=true;
for(int i=0;i<list.size();i++){
if(num<list.get(i)){
if(location==0) location=list.size();
else location--;
list.add(num);
isPrinted=false;
break;
}
}
if(isPrinted){
if(location==0) break;
else answer++;
location--;
}
}
return answer;
}
}
(1) 큐를 사용하기 위해 배열의 요소들을 LinkedList를 생성하여 옮겨준다. 이 문제에서
(2) 맨 앞에 있는 문서를 poll()하고, 우선순위가 더 높은 문서가 있는지 검사한다. 우선순위가 더 높은 문서가 있다면, 맨 뒤로 보낸다.(한칸씩 땡겨졌기 때문에, location--를 해준다. 여기서 location의 의미는 찾고자 하는 문서의 위치이다.)
(3) location이 0인 상태에서, 우선순위가 더 높은 문서가 없어 출력되었다면, 반복문을 종료하고 answerd을 반환한다.
만약 location이 0이 아닌 상태에서 출력되었다면, 다른 문서가 출력된 것이므로 answer++를 해주고, location--를 통해 위치를 한칸 땡겨준다.

크케 어려운 문제는 아니었지만, LinkedList를 생성하는 부분에서 해맸다. 이 문제에서는 LinkedList의 요소에 접근하기 위해 get()함수를 사용했어야 하는데, Queue list=new LinkedList<>();로 생성하니 get()함수를 사용할 수 없는 것이다.
그리고 List list=new LinkedList<>(); 로 생성하면 get()함수는 사용할 수 있는데, poll()함수는 사용하지 못한다. 뭐가 문젠가 싶어 조금 알아보았더니, LinkedList는 List와 Queue 인터페이스를 모두 구현한 클래스라고 한다.
LinkedList 클래스는 세가지 방법으로 생성이 가능하다.
첫번째나 두번째 방법으로 선언하면, Queue 인터페이스나 List 인터페이스에 선언되어 있는 함수만 사용이 가능하다. Queue인터페이스에는 poll(),peek()함수는 선언되어 있지만, get() 함수는 없다.
List 인터페이스에는 get() 함수는 사용할 수 있지만, poll(),peek()과 같은 함수는 없다.
그렇기 떄문에, LinkedList가 두 인터페이스를 모두 구현한 객체라고 하더라도 Queue형,List형으로 생성이 되면 각각의 인터페이스에 선언되어 있는 함수만 사용이 가능하다.
나처럼 poll()함수도 사용하고 get() 함수도 사용하고 싶다면, LinkedList 형으로 생성해주어야 한다.
아직도 컬렉션 사용에 미숙함이 있는 것 같다.
다형성의 유연함을 위해서 업캐스팅 하는 것이 습관이 되어 있지만, 이번 처럼 LinkedList형으로 그대로 사용해야 하는 경우도 있다는 것을 알 수 있었다.
출처 : 프로그래머스 코딩 테스트 연습 https://school.programmers.co.kr/learn/challenges