문제
한 쪽 벽면에 다음과 같이 노란색 상자들이 쌓여 있다.
높은 곳의 상자를 낮은 곳에 옮기는 방식으로 최고점과 최저점의 간격을 줄이는 작업을 평탄화라고 한다.
평탄화를 모두 수행하고 나면, 가장 높은 곳과 가장 낮은 곳의 차이가 최대 1 이내가 된다.
평탄화 작업을 위해서 상자를 옮기는 작업 횟수에 제한이 걸려있을 때, 제한된 횟수만큼 옮기는 작업을 한 후 최고점과 최저점의 차이를 반환하는 프로그램을 작성하시오.
제약 사항
가로 길이는 항상 100으로 주어진다.
모든 위치에서 상자의 높이는 1이상 100이하로 주어진다.
덤프 횟수는 1이상 1000이하로 주어진다.
주어진 덤프 횟수 이내에 평탄화가 완료되면 더 이상 덤프를 수행할 수 없으므로 그 때의 최고점과 최저점의 높이 차를 반환한다 (주어진 data에 따라 0 또는 1이 된다).
입력
총 10개의 테스트 케이스가 주어지며, 각 테스트 케이스의 첫 번째 줄에는 덤프 횟수가 주어진다.
그리고 다음 줄에 각 상자의 높이값이 주어진다.
출력
#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스의 최고점과 최저점의 높이 차를 출력한다.
풀이
루프를 돌며 max, min을 구하고 최대값과 최소값을 각각 -1, +1을 해준다.
루프를 마치면 다시 최대, 최소값을 구해 그 차를 구한다.
import java.util.Scanner;
class Flatten {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for (int test_case = 1; test_case <= 10; test_case++) {
int dumpNum = sc.nextInt();
int [] dumps = new int[100];
int count = 0;
int answer = 0;
for (int i = 0; i < dumps.length; i++) {
dumps[i] = sc.nextInt();
}
while (count < dumpNum) {
int max = 0;
int min = 1000;
int maxIdx = 0;
int minIdx = 0;
for (int i = 0; i < dumps.length; i++) {
if (dumps[i] > max) {
max = dumps[i];
maxIdx = i;
}
}
for (int i = 0; i < dumps.length; i++) {
if (dumps[i] < min) {
min = dumps[i];
minIdx = i;
}
}
dumps[maxIdx]--;
dumps[minIdx]++;
count++;
}
int max = 0;
int min = 1000;
for (int i = 0; i < dumps.length; i++) {
if (dumps[i] > max) max = dumps[i];
}
for (int i = 0; i < dumps.length; i++) {
if (dumps[i] < min) min = dumps[i];
}
answer = max - min;
System.out.println("#" + test_case + " " + answer);
}
}
}
'코딩테스트 > SWEA' 카테고리의 다른 글
[JAVA] SWEA 1210번 Ladder1 (0) | 2021.07.27 |
---|---|
[JAVA] SWEA 1220번 Magnetic (0) | 2021.07.27 |
[JAVA] SWEA 1209번 Sum (0) | 2021.07.27 |
[JAVA] SWEA 1206번 View (0) | 2021.07.26 |
[JAVA] SWEA 1204번 최빈수 구하기 (0) | 2021.07.26 |
댓글