[Programmers] 무지의 먹방 라이브

2022. 2. 13. 12:14· Algorithm
반응형

- 알고리즘 분류 : 그리디 알고리즘

- 사용 언어 : JAVA

- 문제 요점

  1. 우선순위 큐를 이용하여 시간이 적게 걸리는 음식 순대로 확인
  2. 음식을 먹는데 시간이 적은 순서대로 확인하기 때문에, 뒤에 있는 음식들은 현재 음식보다 무조건 시간이 많거나 같다는 것을 인지하고 풀이

 

소스 설명은 주석을 참고해주세요.

import java.util.*;

// 음식 클래스 선언
class Food implements Comparable<Food> {

    // 먹는 시간
    private int time;
    
    // 음식 번호
    private int index;

    public Food(int time, int index) {
        this.time = time;
        this.index = index;
    }

    public int getTime() {
        return this.time;
    }

    public int getIndex() {
        return this.index;
    }

    // 우선순위 큐에서 사용
    @Override
    public int compareTo(Food other) {
        if(this.time < other.time)
            return -1;
        else 
            return 1;
    }
}

class Solution {
    public int solution(int[] food_times, long k) {
        // 우선순위 큐 선언
        PriorityQueue<Food> pq = new PriorityQueue<>();
        
        // 모든 음식을 먹는데 필요한 시간
        long summary = 0;
        
        // 모든 음식을 먹는데 필요한 시간 구하기 & 우선순위 큐에 넣기
        for (int i = 0; i < food_times.length; i++) {
            summary += food_times[i];
            pq.offer(new Food(food_times[i], i + 1));
        }
        
        // 만약, 모든 음식을 먹는데 필요한 시간보다 k가 같거나 크다면 -1 반환(먹을 수 있는 음식이 없음)
        if (summary <= k) 
            return -1;

        // 지금까지의 음식을 먹은 시간
        summary = 0; 
        
        // 이전 음식을 먹는데 걸리는 시간
        long previous = 0; 
        
        // 현재 남아있는 음식의 갯수
        long length = food_times.length; 

        // (지금까지의 음식을 먹은 시간 + (현재 음식을 먹는데 걸리는 시간 - 이전 음식을 먹는데 걸리는 시간) * 현재 남아있는 음식의 갯수) 가 k보다 작거나 같을 때
        // peek()은 꺼내는 것이 아닌 확인만 함
        while (summary + ((pq.peek().getTime() - previous) * length) <= k) {
            // 큐에서 꺼내고
            int now = pq.poll().getTime();
            
            // 지금까지 음식을 먹는데 필요한 시간에 더해준다.
            summary += (now - previous) * length;
            
            // 하나의 음식을 다 먹었으니 -1 처리
            length -= 1; 
            
            previous = now; 
        }

        // 음식 번호대로 정렬을 하기위해 ArrayList 이용
        ArrayList<Food> result = new ArrayList<>();
        
        // 우선순위 큐에 남아있는 음식들을 ArrayList에 넣어준다.
        while (!pq.isEmpty()) {
            result.add(pq.poll());
        }
        
        // 음식 번호 순서대로 정렬
        Collections.sort(result, new Comparator<Food>() { 
            @Override
            public int compare(Food a, Food b) {
                return Integer.compare(a.getIndex(), b.getIndex());
            }
        });
        
        // 결과 출력
        return result.get((int) ((k - summary) % length)).getIndex();
    }
}
반응형

'Algorithm' 카테고리의 다른 글

[BAEKJOON] 1197번 : 최소 스패닝 트리 (JAVA)  (0) 2022.02.15
[Programmers] 양과 늑대 (Java)  (0) 2022.02.13
[BAEKJOON] 1647번 : 도시 분할 계획 (JAVA)  (0) 2022.02.12
[이것이 코딩테스트다] 9. 그래프 - 실전 문제 풀이  (0) 2022.02.12
[BAEKJOON] 2665번 : 미로만들기 (JAVA)  (0) 2022.02.11
'Algorithm' 카테고리의 다른 글
  • [BAEKJOON] 1197번 : 최소 스패닝 트리 (JAVA)
  • [Programmers] 양과 늑대 (Java)
  • [BAEKJOON] 1647번 : 도시 분할 계획 (JAVA)
  • [이것이 코딩테스트다] 9. 그래프 - 실전 문제 풀이
멍목
멍목
개발 관련 새롭게 알게 된 지식이나 좋은 정보들을 메모하는 공간입니다.
반응형
멍목
김멍목의 개발블로그
멍목
전체
오늘
어제
  • 분류 전체보기 (514)
    • BE (190)
      • Spring (21)
      • Java (141)
      • Kotlin (6)
      • JPA (22)
    • FE (33)
      • Javascript (16)
      • Typescript (0)
      • React (5)
      • Vue.js (9)
      • JSP & JSTL (3)
    • DB (32)
      • Oracle (22)
      • MongoDB (10)
    • Algorithm (195)
    • Linux (8)
    • Git (6)
    • etc (42)
    • ---------------------------.. (0)
    • 회계 (4)
      • 전산회계 2급 (4)
    • 잡동사니 (2)

블로그 메뉴

  • 홈
  • 관리

공지사항

인기 글

태그

  • MongoDB 기초부터 실무까지
  • vue3 공부
  • 자바 공부
  • 더 자바 애플리케이션을 테스트하는 다양한 방법
  • 자기개발
  • 코테 공부
  • 이펙티브 자바
  • MongoDB 공부
  • java 8
  • junit5
  • 자기공부
  • 더 자바 Java 8
  • JPA
  • 전산회계 2급 준비
  • Oracle
  • 자기 공부
  • 코틀린
  • 알고리즘공부
  • 자바 테스팅 프레임워크
  • 자기 개발
  • JPA 공부
  • 코테공부
  • 알고리즘 공부
  • Effective Java
  • 프로젝트로 배우는 Vue.js 3
  • MongoDB with Node.js
  • 이펙티브자바
  • 자바 개발자를 위한 코틀린 입문
  • 자바공부
  • Java to Kotlin

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
멍목
[Programmers] 무지의 먹방 라이브
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.