JAVA/Algorithm

[프로그래머스/java] 프린터 (속도 차이)

nang. 2020. 12. 23. 22:29
반응형
SMALL

https://programmers.co.kr/learn/courses/30/lessons/42587

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

 

  • List 사용 방법
    • 속도가 다소 느림
import java.util.*;

class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0;
        
        List<Integer> prior = new ArrayList<Integer>(); // 우선 순위 정보
        List<Integer> loc = new ArrayList<Integer>(); // 위치 정보
        
        for(int i = 0; i < priorities.length; i++) {
            prior.add(priorities[i]); // 우선순위배열 내용을 순서대로 prior 배열에 넣기
            loc.add(i); // 인덱스를 순서대로 location 배열에 넣기
        }
        
        int count = 0;
        
        while(true) {
            int l = loc.get(0); // 현재 위치 정보 맨 앞꺼를 l에 지정
            int p = prior.get(0); // 우선 순위 맨 앞꺼를 p에 지정
            
            loc.remove(0); // l에 지정 후 위치 정보 제거
            prior.remove(0); // p에 지정 후 우선순위 정보 제거
            
            if(prior.size() == 0) { // 만약 prior 배열에서 우선순위 정보 전부 다 제거 돼서 사이즈가 0이면
                answer += count + 1;
                break;
            }
            
            if(Collections.max(prior) > p) { // 현재 맨 앞의 우선순위보다 다른 큰 우선순위가 있다면
                prior.add(p); // 현재 맨 앞 우선순위를 맨 뒤에 넣기 위해 다시 add
                loc.add(l); // 현재 위치 정보도 함께 뒤로 add
            } else { // 현재 맨 앞의 우선순위보다 다른 큰 우선순위가 없다면
                count += 1; // count 1 증가
                
                if(location == l) { // input location 값과 현재 위치정보가 같다면
                    answer = count;
                    break;
                }
            }
        
        }
        return answer;
    }
}

 

 

 

  • 아예 다른 사고
    • 속도가 빠름
/* 속도가 훨씬 빠름 */
import java.util.*;

class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0; // 여기서 answer는 처리 횟수 (몇번째로 인쇄되는지)
        
        int index = 0; // 처리 위치
        
        while(answer < priorities.length) { // 처리 횟수는 대기목록(priorities의 사이즈 이상이 될 수 없으므로)
            boolean flag = true;
            
            if(index == priorities.length) { // 배열의 사이즈라는건 인덱스 초과니까 다시 처음으로 돌려줌
                index = 0;
            }
            
            int j = priorities[index]; // 현재 우선순위
            
            for(int i = 0; i < priorities.length; i++) { // 현재 우선순위보다 다른 큰 우선순위가 있는지 확인하기 위함
                if(i == index)
                    continue;
                
                if(priorities[i] > j) { // 다른 큰 우선순위가 있으면
                    flag = false; // false로 변경
                    break;
                }
            }
            
            if(flag) { // true라는건 현재 우선순위가 가장 크다는 것
                priorities[index] = 0; // 가장 큰 우선순위를 0으로 바꿔줌 == 처리했다는 표시를 해주는 것
                answer++; // 처리 횟수 1 증가
                
                if(index == location) { // 현재 위치가 찾고자하는 위치라면
                    return answer; // 현재의 처리 횟수 리턴
                }
            }
            
            // 다른 큰 우선순위가 있다면
            index++; // priorities에서 다음 우선순위로 넘어가는 것을 해주기위해 index를 1 증가시킴
        }
        
        return answer;
    }
}
반응형
LIST