티스토리 뷰
문제
N명의 학생을 M개의 팀으로 나누려고 한다. 각 학생은 본인의 능력을 나타내는 숫자를 하나씩 갖고 있으며, 편의상 팀을 나눌 때에는 연속한 학생들을 하나의 팀으로 만든다고 하자. 예를 들어, 다음 그림은 10명의 학생을 3개의 팀으로 나누는 두 가지 예이다.
각 팀의 점수는 그 팀에 속한 학생들의 점수의 합이다. 예를 들어, 첫 번째의 경우 각 팀의 점수는 9/7/14 가 되며, 두 번째의 경우에는 4/16/10 이 된다. 팀을 잘 나누기 위해서는, 각 팀의 점수가 비슷해야 한다. 즉, 하나의 팀의 점수가 매우 높아서는 안 된다. 따라서 점수가 최대인 팀의 점수를 최대한 적게 만들고 싶다. 위의 예제에서는 아래와 같이 나누게 되면, 각 팀의 점수가 9/11/10 이 된다. 점수가 최대인 팀은 11이며, 어떻게 하더라도 점수가 가장 높은 팀을 11보다 적게 팀을 나눌 수는 없다.
N명의 학생의 점수와 나누고자 하는 팀의 개수 M이 주어질 때, 점수가 가장 높은 팀이 갖는 점수의 최솟값을 출력하는 프로그램을 작성하시오.
입력
첫 번째 줄에 학생의 수 N과 나누고자 하는 팀의 개수 M이 주어진다. (1 ≤ N, M ≤ 500) 두 번째 줄에는 N명의 학생의 점수가 주어진다.
출력
점수가 가장 높은 팀이 갖는 점수의 최솟값을 출력한다.
예제 입력
10 3
1 3 5 2 2 3 4 6 3 1
예제 출력
11
코드 / 이분탐색
///팀나누기
import java.util.*;
public class Main {
public static ArrayList<Integer> box = new ArrayList<>();
public static int result = Integer.MAX_VALUE;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//총 몇개의 숫자를 입력 받을 것인지
int a;
int b;
int c[];
int d;
int max = 0;
int min = 0;
int cur = 0;
a = sc.nextInt();
b = sc.nextInt();
c = new int[a + 1];
d = 0;
for (int i = 1; i <= a; i++) {
c[i] = sc.nextInt();
d = c[i] + d;
if (c[i] > min) min = c[i];
}
findMin(c, min, d, b);
System.out.println(result);
}
public static void findMin(int[] c, int s, int r, int b) {
if (s > r) {
return;
} else {
int mid = (s + r) / 2;
int isGood = isFind(c, mid, b);
if (isGood == -1) {
if (mid < result) result = mid;
findMin(c, s, mid - 1, b);
} else findMin(c, mid + 1, r, b);
}
}
public static int isFind(int[] c, int mid, int b) {
int cur = 0;
int max = mid;
for (int i = 1; i < c.length; i++) {
cur += c[i];
if (cur > max) {
cur = c[i];
b--;
}
if (b == 0) return 1;
}
return -1;
}
}
'알고리즘 문제 풀이 ' 카테고리의 다른 글
버튼 누르기 (1) | 2018.10.27 |
---|---|
특정 최단거리 (0) | 2018.10.24 |
파티 (0) | 2018.10.24 |
최단거리 (0) | 2018.10.22 |
연속부분의 최대 합 (0) | 2018.10.11 |
자원채취 (0) | 2018.10.11 |
제곱수의 합 (0) | 2018.10.11 |
직사각형 배치의 경우의 수 (0) | 2018.10.10 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백준
- java #알고리즘 #백준 #퇴사
- 백준 #java #알고리즘
- java #오르막수 #백준 #알고리즘
- 2630번
- webspider
- javascript #백준 #회의실배정 #알고리즘
- 중간거리 #야만나 #약속장소추천 #중간위치 #웹 #리액트 #React #reactjs #kakao지도 #kakaoapi
- java #알고리즘 #백준 #패션왕신해빈
- java #알고리즘 #백준 #N과M #백트래킹
- 1992번
- java #퀵소트 #quicksort #알고리즘 #백준
- java #알고리즘 #백준
- java #백준 #알고리즘 #2805 #나무자르기
- Javascript
- 백준 #알고리즘 #전깃줄 #NodeJs #javascript
- 한글 자동 완성
- java #백준 #알고리즘 #로또 #6603
- javascript #연속합 #알고리즘 #백준
- Game
- Terminal
- javascript #백준 #알고리즘 #LCS
- npm
- 쿼드트리
- java #하노이 #알고리즘 #백준
- 색종이자르기
- react
- TypeScript
- 알고리즘
- webpack
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함