📌 문제 링크
✅ 테스트케이스는 통과했지만 제출 시 실패한 코드 💦
import java.util.*;
class Solution {
public int solution(int[] priorities, int location) {
if (priorities.length == 0) {
return 0;
}
int answer = 0;
Queue<Integer> q = new LinkedList<>();
for (int i = 0; i<priorities.length; i++){
q.add(priorities[i]);
}
Arrays.sort(priorities);
for (int i = 0; i < priorities.length / 2; i++) {
int temp = priorities[i];
priorities[i] = priorities[priorities.length - 1 - i];
priorities[priorities.length - 1 - i] = temp;
}
int first = priorities[0];
while(!q.isEmpty()){
Integer a = q.poll();
if (a==first){
answer++;
if (answer < priorities.length) {
first = priorities[answer];
}
location--;
if (location==-1) return answer;
}
else{
location--;
if (location==-1) location = priorities.length - 1;
q.add(a);
}
}
return answer;
}
}
이유는 바로 else문에서 큐의 사이즈가 아닌 priorities의 사이즈를 통해 location의 위치를 바꾸었기 때문입니다.
이 사실을 알 수 있었던 테스트 케이스는 다음과 같습니다.
✅ 정답 코드 및 설명
import java.util.*;
class Solution {
public int solution(int[] priorities, int location) {
if (priorities.length == 0) {
return 0;
}
int answer = 0;
Queue<Integer> q = new LinkedList<>();
for (int i = 0; i<priorities.length; i++){
q.add(priorities[i]);
}
Arrays.sort(priorities);
for (int i = 0; i < priorities.length / 2; i++) {
int temp = priorities[i];
priorities[i] = priorities[priorities.length - 1 - i];
priorities[priorities.length - 1 - i] = temp;
}
int first = priorities[0];
while(!q.isEmpty()){
Integer a = q.poll();
location--;
if (a==first){
answer++;
if (answer < priorities.length) {
first = priorities[answer];
}
if (location==-1) return answer;
}
else{
q.add(a);
if (location==-1) location = q.size() - 1;
}
}
return answer;
}
}
코드를 설명하기 전에 테스트케이스를 고치기 위해 바꾼 부분부터 설명하자면, 먼저 if-else문 양쪽에 중복으로 나타나는 location--를 밖에서 한줄로 썼습니다.
또한, 위에서 설명했듯 priorities의 사이즈를 통해서 location을 뒤로 보내는 것이 아닌 요소가 나가면서 사이즈가 바뀌는 큐의 사이즈를 통해서 location을 뒤로 보냈습니다.
이제부터 코드에 대해 설명하겠습니다.
이 문제를 풀 때 중요하게 짚고 여겨야 했던 부분은, 제가 생각하기에 큐의 요소가 삭제되고 뒤로 들어오며 변하는 location의 위치를 잃지 않는 것. 그리고 우선순위를 검사하는 것.입니다.
우선순위를 검사하는건 priorities 배열을 내림차순 정렬해서, 큐의 요소와 비교해서 같으면 최고 우선순위라는 것이니 해당 요소를 내보냄과 다음 우선순위를 참조하기 위해 내림차순한 배열의 다음 값을 참조하게 했습니다.
그리고 location의 위치를 잃지 않게 하기 위해 큐의 요소가 변할 때마다 이에 맞추어 location의 값을 하나씩 줄여 나갔고, 해당 location이 큐의 맨 뒤로 갈 때도 이를 큐의 맨 뒤 인덱스값으로 바꾸어 주었습니다.
최종적으로 코드를 설명하자면,
큐에서 pop한 값이 우선순위로 나가야하는 프로세스가 맞다면, 일단 프로세스가 실행된 것이니, 문제에서 주어진 프로세스가 몇 번째로 실행되는지를 나타내는 answer값을 하나 더합니다.
그리고 해당 우선순위 프로세스 값이 나간 거니까 우선순위도 그 다음껄로 바꿔줍니다. 이때 결국 그 다음값의 인덱스가 answer랑 똑같다는 사실을 발견해서 priorities의 인덱스를 answer로 바꿔줬습니다!
유심히 생각해보면 우선순위로 나가야하는 프로세스의 개수(0부터 시작)와 priorities 배열의 인덱스 값이 같다는 것을 알 수 있습니다.!
또한, pop을 했으니 모든 프로세스들이 앞으로 가야하니까 이를 따라가기 위해 location도 하나 줄이고(여기서 location은 문제에서 몇 번째로 실행되는지가 궁금한 프로세스의 위치), 이 값이 -1이면 우선순위로 나간 게 궁금한 프로세스의 위치인 것이니 이를 출력하면 됩니다.
반면, 큐에서 pop한 값이 우선순위로 나가야하는 프로세스가 아니라면, 해당 요소를 큐의 맨 뒤에 삽입합니다.
만약 이 맨뒤에 삽입하는게 저희가 궁금한 프로세스라면 그 위치를 따라가야하니까 location을 큐의 마지막 인덱스 값으로 바꿔주어야겠죠!
😆 후기
사실 이 문제는 하루 1~2시간정도씩 이틀에 걸쳐서 풀었는데요! 첫날에는 변하는 location을 어떻게 알아낼 수 있을지 모르겠어서 다음날 풀 것을 기약하며 하루를 보냈는데요.
다음날이 돼서 다시 문제를 켜니 저장이 안되어있더라구요ㅎ
그래서 어쩔 수 없이 처음부터 풀었는데 이게 오히려 좋았던 거 같습니다.
첫째날 코드는 (기억은 잘 안나지만) while문으로 큐가 빌 때까지 반복하고 그 안에서 for문으로 큐의 인덱스에 하나하나 접근해가며 해당 값이 우선순위가 맞는지 검사해나갔는데요!
둘째날이 되어 다시 생각해보니 굳이 for문으로 큐의 요소에 접근하지 않아도 pop을 해나가며 검사해도 되겠더라구요!
이 생각이 나니 그 후로는 잘 풀렸던 거 같습니다!ㅎㅎ
앞으로도 화이탱
'코딩 테스트 일지 📒' 카테고리의 다른 글
[백준] 2606 바이러스 | 그래프, DFS, BFS | 실버 Ⅲ | JAVA 💡DFS (1) | 2024.10.06 |
---|---|
[백준] 11720 숫자의 합 | 수학, 구현, 문자열 | 브론즈 Ⅳ | JAVA 💡기본 상식 점검 (0) | 2024.10.04 |
[백준] 9093 단어 뒤집기 | 구현, 문자열 | 브론즈 Ⅰ | JAVA 💡시간복잡도 아주 간단하게 줄이는 방법 (2) | 2024.09.28 |
[프로그래머스] 2021 KAKAO BLIND RECRUITMENT 신규 아이디 추천 | Level.1 | JAVA 💡정규표현식 (0) | 2024.09.27 |
[백준] 3460 이진수 | 구현, 수학 | 브론즈 Ⅲ | JAVA 💡25%에 틀렸습니다. 완벽 해결법 + 1등하는 법 (0) | 2024.09.24 |