광규니
광규니네
광규니
전체 방문자
오늘
어제
  • 분류 전체보기 (154)
    • 알고리즘 (100)
      • 알고리즘 개념 (2)
      • 문제 풀이 (96)
    • 주절주절 (19)
      • 자격증, 활동 후기 (4)
      • 전시회 후기 (3)
      • 이모저모 (2)
      • 회고 (3)
      • 뜨럼 (7)
    • 운영체제 (9)
    • 개발 지식 (9)
      • Apple Watch (4)
      • MySQL (2)
      • Eclipse (1)
      • XCode (1)
    • 네트워크 공부 (1)
    • 데이터베이스 공부 (5)
    • Java 공부 (7)
    • TMP (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 오블완
  • OS
  • 자바
  • 개념
  • 알고리즘
  • BOJ
  • 티스토리챌린지
  • 운영체제
  • 파이썬
  • 애플워치 앱 만들기
  • 프로그래머스
  • 애플워치 앱
  • 합주
  • 백준
  • 드린이
  • 컴퓨터 사이언스
  • BFS
  • 다이나믹 프로그래밍
  • DP
  • 구현

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
광규니

광규니네

알고리즘/문제 풀이

[Java/자바 백준 1781] 컵라면

2022. 3. 29. 16:57
반응형

풀이

문제들을 deadLine이 작은 순, 받을 수 있는 컵라면 갯수가 큰 순으로 arraylist에 정렬했습니다.

 

컵라면을 최대한 많이 받으려면 deadline순으로 라면이 가장 많이 얻을 수 있도록 그리디하게 탐색해야하기 때문입니다.

 

PriorityQueue를 사용해서 queue를 minHeap이라고 생각해줍시다.

 

arr에 정렬되있는 값들을 탐색하면서

1. 큐 사이즈가 현재 데드라인보다 작다면 - 큐에 삽입을 해줍니다

 

2. 만약 큐 사이즈와 현재 데드라인이 같다면 큐의 peek(현재까지 얻을 수 있는 라면 중 가장 최솟값)과 비교를 해줍시다.

만약 peek가 작다면 빼주고 현재 라면수를 넣어주도록 합시다.

 

마지막으로 큐에 들어간 값들을 모두 더해주면 됩니다 !

import java.io.*;
import java.util.*;

public class Main {

	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		StringTokenizer st;
		ArrayList<Problem> arr = new ArrayList<>();
		PriorityQueue<Integer> queue = new PriorityQueue<>();
		
		int max = 0;
		for(int i = 0 ; i < N ; i++) {
			st = new StringTokenizer(br.readLine());
			int deadLine = Integer.parseInt(st.nextToken());
			int cupRamen = Integer.parseInt(st.nextToken());
			arr.add(new Problem(deadLine, cupRamen));
		}
		// 데드라인이 작고, 라면이 큰순으로 정렬하기 
		Collections.sort(arr);
		
		for(Problem problem : arr) {
			// 사이즈는 일(day)  수를 뜻함 
			int size = queue.size();
			// 데드라인이 작다면 무조건 삽입 가능 
			if(size < problem.deadLine) {
				queue.offer(problem.cupRamen);
			}
			// 같은 날짜라면, 큐에 담겨진 가장 작은 라면수와 현재 라면수랑 비교하기 
			else if(size == problem.deadLine) {
				int peek = queue.peek();
				// 현재 라면이 크다면 큐에 있던것을 빼주고 현재 값으로 넣어주기 
				if(problem.cupRamen > peek) {
					queue.poll();
					queue.add(problem.cupRamen);
				}
			}
		}
		while(!queue.isEmpty()) {
			max += queue.poll();
		}
		System.out.println(max);
	}
	
	private static class Problem implements Comparable<Problem>{
		int deadLine, cupRamen;
		
		public Problem(int deadLine, int cupRamen) {
			this.deadLine = deadLine;
			this.cupRamen = cupRamen;
		}
		
		// deadline이 작은 순, 컵라면이 큰 순 
		public int compareTo(Problem o) {
			if(o.deadLine == this.deadLine) {
				return o.cupRamen - this.cupRamen;
			}
			return this.deadLine - o.deadLine;
		}
	}
}
반응형
저작자표시 (새창열림)

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[Java/자바 백준 1504] 특정한 최단 경로  (0) 2022.03.30
[Java/자바 백준 1459] 걷기  (0) 2022.03.29
[Java/자바 백준 23290] 마법사 상어와 복제  (0) 2022.03.28
[Java/자바 백준 16928] 뱀과 사다리 게임  (0) 2022.03.27
[Java/자바 백준 16954] 움직이는 미로 탈출  (0) 2022.03.11
    '알고리즘/문제 풀이' 카테고리의 다른 글
    • [Java/자바 백준 1504] 특정한 최단 경로
    • [Java/자바 백준 1459] 걷기
    • [Java/자바 백준 23290] 마법사 상어와 복제
    • [Java/자바 백준 16928] 뱀과 사다리 게임
    광규니
    광규니
    공부 및 일상 올리기~

    티스토리툴바