[プログラマ]プリンタ(Java)


🔗 質問リンク


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

👨🏻‍💻 イニシャルコード

import java.util.*;

class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0; // 순서 count
        int loc = location; // 출력하고자하는 값의 현재 위치를 나타내는 변수
        int first; // List의 첫번째 값을 저장할 변수
                
        List<Integer> jobList = new LinkedList<>();
        for (int i: priorities)
            jobList.add(i);
        
        while (true) {
            first = jobList.remove(0);   
            if (first >= Collections.max(jobList)) {
                answer++;
                if (loc == 0) break;
                else loc--;
            }
            else {
                jobList.add(first);
                if (loc == 0) 
                    loc = (jobList.size()-1);
                else loc--;
            }              
        }
        return answer;
    }
}
採点して問題が発生し、2,5,18回の運転時エラーが発生しました.コードの実行時間を短縮するために不要な収集.max(jobList)演算を減らしてみます.

👨🏻‍💻 Collections.最大(jobList)演算のコードを減らす

import java.util.*;

class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0; // 순서 count
        int loc = location; // 출력하고자하는 값의 현재 위치를 나타내는 변수
        int first; // List의 첫번째 값을 저장할 변수
        int max;
                
        List<Integer> jobList = new LinkedList<>();
        for (int i: priorities)
            jobList.add(i);
        
        max = Collections.max(jobList);
        
        while (true) {
            first = jobList.remove(0);   
            if (first >= max) {
            // max값을 매번 찾지 않도록 하여 연산 축소
                max = Collections.max(jobList);
                answer++;
                if (loc == 0) break;
                else loc--;
            }
            else {
                jobList.add(first);
                if (loc == 0) 
                    loc = (jobList.size()-1);
                else loc--;
            }              
        }
        return answer;
    }
}
Collection.最大値を求める演算では、最大値が欠けている場合にのみ変更されますが、2,5,18の問題で実行時間が発生します.
質問でテストデータセットに関する記事を見たとき、1つのデータだけを入れることを考えていないことに気づいたので、テストケースでは1つのデータだけを入れてテストしていたのですが、やはりNoSuchExceptionが発生しました.以下のようになります.

このエラーは、1つだけのリストからデータを削除したためにデータが空になり、空のリストで最大値を検索したときにエラーが発生したため、リストが空でない場合にのみ実行するための条件が追加され、問題が解決しました.

👨🏻‍💻 最終コード

import java.util.*;

class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0; // 순서 count
        int loc = location; // 출력하고자하는 값의 현재 위치를 나타내는 변수
        int first; // List의 첫번째 값을 저장할 변수
        int max;
                
        List<Integer> jobList = new LinkedList<>();
        for (int i: priorities)
            jobList.add(i);
        
        max = Collections.max(jobList);
        
        while (true) {
            first = jobList.remove(0);   
            if (first >= max) {
                if (!jobList.isEmpty())
                    max = Collections.max(jobList);
                answer++;
                if (loc == 0) break;
                else loc--;
            }
            else {
                jobList.add(first);
                if (loc == 0) 
                    loc = (jobList.size()-1);
                else loc--;
            }              
        }
        return answer;
    }
}

📝 n/a.結論


コードを記述する際には,1つのデータの場合,データがない場合など,複数の状況を考慮し,問題解決に努めるべきである.また、問題が発生した場合は、エラーをチェックし、エラーの解決に努力する必要があります.みんなにExceptionの名前を見せるために、なぜExceptionが起こったのかを知る!!!