경험의 기록

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

 

코딩테스트 연습 - 프린터

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

programmers.co.kr

 

class Solution {
    fun solution(priorities: IntArray, location: Int): Int {
        var answer = 0
        val arr = ArrayList<Pair<Int,Int>>()

        // 우선순위와 알파벳(0 == A, 1 == B..) 저장
        for(i in priorities.indices){
            arr.add(Pair(priorities[i],i))
        }

        // 큐가 다 빌때까지
        while(arr.isNotEmpty()){
            // 정렬하여 최우선순위 값 확인
            val tmpArr = arr.sortedByDescending { it.first }
            val maxPrior = tmpArr[0].first
            
            // arrayList 의 첫번째 원소를 사용함으로써 큐처럼 구현
            if(arr[0].first != maxPrior){
                // 우선순위가 아니라면 맨뒤로 뺌
                arr.add(arr[0])
            }
            else{
                // 우선순위라면 출력하고 (answer++) 
                answer++
                // 그 값이 찾는 값이라면 break
                if(arr[0].second == location){
                    break
                }
            }
            // 맨 앞의 값 제거 (pop)
            arr.removeAt(0)
        }

        return answer
    }
}

큐를 활용하여 문제를 풀었다.

arrayList를 큐처럼 사용하기 위해 첫번째 값을 계속 pop 해주었고,

pop된 값이 최우선순위가 아니라면 맨뒤에 다시 추가해줌으로써

큐가 다 비어있거나 원하는 알파벳을 찾을 때 종료되도록 하였다.

 

처음에는 위와 같이 계속 정렬해보아서 최대값을 찾아서 확인했었는데,

 

class Solution {
    fun solution(priorities: IntArray, location: Int): Int {
        var answer = 0
        val arr = ArrayList<Pair<Int,Int>>()

        // 우선순위와 알파벳(0 == A, 1 == B..) 저장
        for(i in priorities.indices){
            arr.add(Pair(priorities[i],i))
        }

        // 큐가 다 빌때까지
        while(arr.isNotEmpty()){
            // arrayList 의 첫번째 원소를 사용함으로써 큐처럼 구현
            if(arr.any { arr[0].first < it.first }){
                // 우선순위가 아니라면 맨뒤로 뺌
                arr.add(arr[0])
            }
            else{
                // 우선순위라면 출력하고 (answer++)
                answer++
                // 그 값이 찾는 값이라면 break
                if(arr[0].second == location){
                    break
                }
            }
            // 맨 앞의 값 제거 (pop)
            arr.removeAt(0)
        }

        return answer
    }
}

any를 활용하여 조건을 파악하는 것이 훨씬 효율적이기 때문에 변경해주었다.

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading