코딩테스트

[프로그래머스/자바] 프로세스_42587

라임온조 2023. 7. 10. 14:37

문제 및 코드

생각

// 생각
    // 대놓고 큐를 쓰라고 알려 줬음. 근데 우선순위 큐인가
// 구현
    // 우선순위 큐를 만들어서 priorities를 우선순위 큐에 넣는다
    // 우선순위 큐를 돈다
        // priorities를 돈다
            // 우선순위 큐의 값과 priorities의 값이 같다
                // priorities를 도는 index와 location 값이 같다
                    // answer에 1 추가하고 답으로 return
                // priorities를 도는 index와 location 값이 다르다
                    // 큐에서 값 하나 빼고 answer에 1 추가하고 다음 priorities로 넘어간다
            // 우선순위 큐의 값과 priorities의 값이 다르다
                // 다음 priorities로 넘어간다

회고

  • 문제 이해가 잘 안 돼서 시간이 좀 걸림
  • 우선순위큐를 이용해서 프로세스 저장을 하는 건 알겠는데 그 이후에 어떻게 해야하는 지 감이 잡히지 않아서 다른 풀이를 참고했음
  • 다른 풀이 참고했는데도 왜 그렇게 해야하는 지 아직 정확히 이해가 안 감...
    • 왜 index랑 location이랑 값이 다르면 큐에서 값을 빼고 answer에 1을 더해야 하는 걸까

-----

  • 문제 이해를 이상하게 해서 테스트 케이스 이해하는데 시간이 걸림. 테스트 케이스의 배열은 큐 모양이 아닌 큐에 들어있는 순서대로 적어 놓은 것이라는 걸 기억하자. 나 혼자 큐 모양이라고 생각하고 착각해서 이상하게 이해할 뻔함.
  • 우선순위큐 선언은 그냥 pq... 그리고 역순으로 할 거면 괄호 안에 Collections.reverseOrder()를 적어주면 된다
  • 이 문제의 핵심은 우선순위 큐에 넣은 후의 처리 같음
    • 우선순위 큐에 넣은 결과는 우선순위 높은 순서대로 프로세스를 뽑을 수 있게 해 놓은 것
    • 그런 우선순위 큐에서 하나를 뺀 후 원래의 priorities 돌면서 값을 비교했을 때 같다는 것은 우선순위 큐에서 뽑은 값이 원래의 priorities에 있을 때의 위치를 찾은 것
      • 그런데 위에서 찾은 위치의 값과 문제에서 주어진 location값이 같다는 것은 문제에서 찾으려고 하는 location값을 지금 찾았다는 것. 근데 정답 결과는 인덱스가 1부터 시작이니 answer를 0으로 설정해놓은 경우 1을 더한 후 바로 정답 리턴(값도 같고 위치도 같은 경우)
      • 그런데 위에서 찾은 위치의 값과 문제에서 주어진 location값이 다르다는 것은 문제에서 찾으려고 하는 location값을 아직 찾지 못했다는 것. 그럼 현재 우선순위 큐에서 뽑은 값의 원래 어디인지는 찾았지만 내가 원하는 위치에 있는 값은 아니니 큐에서 하나 제거를 하고 answer도 1을 증가시킨 후 다음 큐에서 뽑은 값과 다음 priorities의 값을 비교해 나가야 한다. (값은 같지만 위치는 다른 경우)
    • 우선순위 큐에서 하나를 뺀 후 원래의 priorities를 돌면서 값을 비교했을 때 값이 다르다는 것은 우선순위 큐에서 뽑은 값이 원래의 priorities에 있을 때의 위치를 찾지 못한 것. 그러니까 priorities의 다음값을 봐야 함.
  • 뭔가 이해가 될 듯 말 듯...

 

 

 

기억

  • 우선순위큐를 생성하는 방법
PriorityQueue<Integer> pq = new PriorityQueue<Integer>(); // 오름차순으로 정렬되는 우선순위큐
PriorityQueue<Integer> pq = new PriorityQueue<Integer>(Collections.reverseOrder()); // 내림차순으로 정렬되는 우선순위큐

 

체크

풀이 횟수 시간 정답 여부 참고 여부
1 1시간 30분   O
2 1시간 X O