반응형

문제
알고리즘 에듀 학생들은 코치가 나눠주는 마시멜로를 받기 위해 반별로 학생들이 줄을 서 있다.
알고리즘 에듀는 Q개의 반으로 운영되고 있으며, 각각의 반에 해당하는 학생수는 N_i명이다.
학생들은 본인이 원하는 만큼의 마시멜로를 얻으면 행복해지고 줄을 빠져나간다.
각 줄의 맨 앞에 있는 학생에게만 마시멜로를 줄 수 있으며, 마시멜로를 받은 학생이 빠져나가면 다음 학생이 앞으로 올 수 있다.
K명의 학생들을 행복하게 만들기 위해 필요한 최소 마시멜로의 숫자를 구하는 프로그램을 작성하시오 .
입력
첫 줄에는 반의 수 Q(1<= Q<= 1,000) 와 만족시켜야할 학생의 수 K(1<= K <=1,000,000)를 공백을 두고 입력한다.
각각의 반에 대해 첫째 줄에는 각 반의 학생 숫자 N(1<= N <= 100) 를 입력하고,
두번째 줄에 각 학생들이 원하는 마시멜로의 개수를 나타내는 정수 M(1 <= M <= 10,000)을 공백을 두고 입력한다.
출력
필요한 최소 마시멜로의 개수를 출력한다.
만약 만족시켜야할 학생 수가 줄 서있는 학생수 총 합보다 더 클 경우, 줄 서있는 학생들 모두를 만족시키는 마시멜로의 개수를 출력한다.
입력 예시 1
4 9 3 1 2 3 1 8 2 2 5 3 1 4 6
출력 예시 1
32
입력 예시 2
4 8 3 1 2 3 1 8 2 2 5 3 1 4 6
출력 예시 2
24
코드
Java
import java.util.*; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int classCnt, targetCnt, totalCnt = 0; classCnt = scan.nextInt(); targetCnt = scan.nextInt(); Queue<Integer>[] classes = new LinkedList[classCnt]; for (int i = 0; i < classCnt; i++) { Queue<Integer> queue = new LinkedList<>(); int studentCnt = scan.nextInt(); totalCnt += studentCnt; for (int j = 0; j < studentCnt; j++) { queue.add(scan.nextInt()); } classes[i] = queue; } long givenCnt = 0; int satisfiedStudents = 0; while ((satisfiedStudents < totalCnt) && (satisfiedStudents < targetCnt)) { int classNo = 0; int marshmallow = Integer.MAX_VALUE; for (int i = 0; i < classCnt; i++) { if ((0 < classes[i].size()) && (classes[i].peek() < marshmallow)) { classNo = i; marshmallow = classes[i].peek(); } } classes[classNo].remove(); givenCnt += marshmallow; satisfiedStudents++; } System.out.println(givenCnt); } }
반응형
댓글을 사용할 수 없습니다.