🔗 문제 링크

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번 런타임 에러 발생하였다. 코드의 실행 시간을 줄이기 위해 불필요한 Collections.max(jobList)연산을 줄여보았다.

👨🏻‍💻 Collections.max(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.max값을 구하는 연산을 매번 수행하는 것에서 max값이 빠졌을 때만 수행하게 변경하여도 여전히 2,5,18번 문제에서 런타임이 발생하였다.

질문하기에서 테스트 데이터셋에 대한 글을 보던 중 데이터를 하나만 넣었을 때에 대한 상황을 고려하지 않았다는 것을 깨닫고 테스트 케이스에 데이터 하나만 넣고 테스트하였더니 역시나 아래와 같이 NoSuchException이 발생하였다.

해당 오류는 1개만 있는 List에서 해당 data를 remove하여 데이터가 비어있는데 비어있는 List에서 max값을 찾으려해서 오류 발생한 것이라 list가 비어있지 않을 때만 실행되도록 조건문 추가 하니 문제가 해결되었다.

👨🏻‍💻 최종코드

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;
    }
}


📝 결론

코드를 작성할 때 데이터가 1개일때, 없을 때 등의 여러 경우의 수를 생각하며 문제를 풀도록 노력해야겠다. 또한 문제가 발생하였을 때는 오류 내용을 확인하고 해당 오류를 해결하도록 노력해야겠다. Exception들의 이름을 보고 왜 발생하였는지 알 수 있도록 Exception종류들 알아둘 것!!!!!

profile
블로그 이전했습니다. -> https://seongwon.dev/

0개의 댓글