[JAVA] SWEA (D3) 1208. Flatten

AIR·2023년 11월 18일
0

링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV139KOaABgCFAYh


문제 설명

(정답률 70.52%)
한 쪽 벽면에 다음과 같이 노란색 상자들이 쌓여 있다.

높은 곳의 상자를 낮은 곳에 옮기는 방식으로 최고점과 최저점의 간격을 줄이는 작업을 평탄화라고 한다.

평탄화를 모두 수행하고 나면, 가장 높은 곳과 가장 낮은 곳의 차이가 최대 1 이내가 된다.

평탄화 작업을 위해서 상자를 옮기는 작업 횟수에 제한이 걸려있을 때, 제한된 횟수만큼 옮기는 작업을 한 후 최고점과 최저점의 차이를 반환하는 프로그램을 작성하시오.


입력 예제

834
42 68 35 1 70 25 79 59 63 65 6 46 82 28 62 92 96 43 28 37 92 5 3 54 93 83 22 17 19 96 ...
617
16 40 59 5 31 78 7 74 87 22 46 25 73 71 30 78 74 98 13 87 91 62 37 56 68 56 75 32 53 ...
...


출력 예제

#1 13
#2 32
...


정답 코드

배열에서 최댓값과 최솟값을 구한 뒤 최댓값은 1씩 감소시키고 최솟값은 1씩 증가시키면서
덤프 횟수까지 반복하거나 최댓값과 최솟값의 차이가 0이나 1이 될때까지 반복한다.

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

class SWEA {

    public static void main(String[] args) throws IOException {

        System.setIn(new FileInputStream("src/input.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        for (int test_case = 1; test_case <= 10; test_case++) {
        
            int dump = Integer.parseInt(br.readLine());		//덤프 횟수
            int[] box = Arrays.stream(br.readLine().split(" "))
                    .mapToInt(Integer::parseInt).toArray();	//상자 높이 배열
            int max = Arrays.stream(box).max().orElse(0);	//최고점
            int min = Arrays.stream(box).min().orElse(0);	//최저점
            int diff = max - min;	//차이
			
            //덤프 횟수가 0이거나 차이가 1이나 0이 될 때까지 반복한다
            while (dump > 0 && !(diff == 1 || diff == 0)) {
            	//최고점을 찾은 뒤 -1
                for (int i = 0; i < box.length; i++) {
                    if (box[i] == max) {
                        box[i]--;
                        break;
                    }
                }
                //최저점을 찾은 뒤 +1
                for (int i = 0; i < box.length; i++) {
                    if (box[i] == min) {
                        box[i]++;
                        break;
                    }
                }
                //최고점, 최저점, 차이 갱신
                max = Arrays.stream(box).max().orElse(0);
                min = Arrays.stream(box).min().orElse(0);
                diff = max - min;
                //덤프 1회 진행
                dump--;
            }

            System.out.println("#" + test_case + " " + diff);
        }
    }
}
profile
백엔드

0개의 댓글