티스토리 뷰

프로세스 순서: 

1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.

2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다. 3. 그렇지 않으면 J를 인쇄합니다.

 

처음엔 처음 작업할 문서를 꺼내서 나머지 문서의 중요도와 비교한 뒤 꺼낸 문서의 중요도가 대기 문서 중 한 문서라도 중요도가 밀리면 두 문서를 서로의 위치에 교환하는 작업으로 오해했다. 

 

그렇게 생각하면 중요도가 높은 문서의 위치를 기억하고 있다가 작업 마지막에 맨 앞 문서와 바꿔줘야 했기 때문에 단순 queue로 문제를 푼다고 가정하면 작업이 매우 복잡해지고, 어려워진다. 

 

그래서 실제로 굉장히 오랜시간 삽질하다가 LinkedList는 인덱스의 위치별로 값을 반환받을 수 있으니 결국 List를 만들어 문제를 풀었다.

 

풀고나서 2번 ,3번의 실패 이후에 문제를 제대로 파악했다....하하...이래서 문제를 꼼꼼히 읽는게 가장 중요하다. 

본질은 맨 앞 문서보다 중요도가 높은 문서가 나오면 맨 앞 문서를 맨 뒤로 보낸 뒤 작업을 반복하는 것.

이렇게 생각하면 전자보다 100배는 쉽게 문제에 접근할 수 있으며, 굳이 Index번호를 저장하지 않아도 된다.

(하지만 나는 이미 만들어 놓은 틀을 고치기가 귀찮아서 LinkedList를 그대로 사용했다.)

 

문제는 자신이 출력을 원하는 문서의 위치를 location 변수에 같이 주어, location에 위치한 문서가 언제 출력이 될 수 있는 지를 묻고 있기 때문에 문서의 중요도와 해당 문서의 원본 인덱스를 정수 배열들을 가지고 있는 List를 생성하여 문제를 풀었다.

 

Code: 

package com.choonham;

import java.util.Arrays;
import java.util.LinkedList;


class Solution {
	public int solution(int[] priorities, int location) {
		int answer = 0;
		int[] out = new int[priorities.length]; 
		int j = 0;
		LinkedList<int[]> que = new LinkedList<>();


		for (int i = 0; i < priorities.length; i++) {
			int[] temp = {priorities[i], i };
			que.add(temp);
		}
		boolean toggle = false;
		while(true) {                   
			if(que.isEmpty()) break;
			
			for(int i = 0; i < que.size(); i++) {
				if(que.getFirst()[0] < que.get(i)[0]) {
					que.addLast(que.removeFirst());
					toggle = true;
					break;
				} else {
					toggle = false;
				}
			}
			if(toggle ==  false) {
				out[j] = que.removeFirst()[1];
				j++;
			}
		}
		
		for(int i = 0; i < out.length; i++) {
			if(out[i] == location) {
				answer = i+1;
				break;
			}
		}
		return answer;
	}
	
	
}

 위와 같이 out배열을 따로 구성하여 마지막 부분에 원하는 문서가 언제 출력되는 지 구하는 for문을 한번 더 구현했다.

이 코드가 그다지 효율적이지 않은 코드인 건 잘 알고 있지만, 이미 2시간 가량 삽질을 한 뒤라 좀 더 깔끔하게 수정할 시간이 없다...그래도 정답을 띄웠으니, 그냥그냥 만족하는걸로..ㅎㅎ

물론, 효율은 박살났다.

 

 

오늘의 교훈: 문제는 항상 꼼꼼하게 읽자...

Comments