문제
https://school.programmers.co.kr/learn/courses/30/lessons/42587
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
location이라는 값을 간편히 처리하기 위해서는 실제로 큐처럼 데이터를 넣고 빼고하면 힘들것이라 생각했다.
따라서 priorities라는 배열은 가만히 두고, 배열을 순회하는 식으로 생각했다. 어차피 큐는 한 방향으로 추가 되니 이렇게 순회해도 큰 문제는 없었다. 배열을 넘어가면 다시 0으로 돌아가는 방식으로 말이다.
다음은 우선순위를 어떻게 계산하는가 였다.
나는 현재 배열에서 다음에 빼야할 숫자는 현재 배열에 있는 가장 큰 숫자라고 생각했다. 그리고 내가 배열을 순회하면서 만난 숫자와 그 숫자가 일치하면 빼준다고 처리했다.
단, 빼준다고는 말했지만 위에서 말한대로 priorities 배열은 건드리지 않으려 했다. 따라서 set을 하나두고 빠진 숫자의 인덱스를 체킹해두었다. 이 set을 활용하여 이미 빠진 숫자들은 계산시에 처리 안되게 작성했다.
코드
import java.util.*;
class Solution {
public int solution(int[] priorities, int location) {
Set<Integer> s = new HashSet<>();
int idx = 0;
int cnt = 1;
while(true){ // O(N)
int maxVal = -1;
for(int i=0; i<priorities.length; i++){ // O(N)
if(!s.contains(i)){
maxVal = Math.max(maxVal, priorities[i]);
}
}
// 만약 지금 빼어야 할 숫자면서 체킹되지 않았다면.
if(maxVal == priorities[idx] && !s.contains(idx)){
// 내가 찾던 위치라면
if(idx == location){
return cnt;
}
// 아니라면
s.add(idx);
cnt++;
}
if(idx + 1 == priorities.length){
idx = 0;
} else{
idx++;
}
}
}
}
후기
N이 작기 때문에 이런 방식으로도 쉽게 풀 수 있던 거 같다.
비효율적인거 같아 다른 풀이를 찾아봤는데, 우선순위 큐를 사용하면 더 쉽게 풀 수 있었을 거 같다.
'프로그래머스' 카테고리의 다른 글
LV3 이중우선순위큐 (0) | 2023.11.18 |
---|---|
LV2 피로도 (Java) (0) | 2023.11.15 |
LV2 H-Index (Java) (1) | 2023.11.13 |
LV2 할인 행사 (Java) (1) | 2023.11.12 |
LV2 연속 부분 수열 합의 개수 (Java) (0) | 2023.11.12 |