[SWEA 1208] [S/W 문제해결 기본] 1일차 - Flatten
업데이트:
문제
- SWEA 1208번
- 문제의 저작권은 SW Expert Academy에 있습니다.
접근방식
처음에 생각할때는 그림이 2차원 배열이기 때문에 복잡하게 2차원으로 풀어야겠다는 생각을 했다. 그래서 높이가 있는 인덱스에는 1값을 넣어주고 순회해서 계산해야지~ 라고 생각했지만 막상 코드를 짜보니 너무 어렵고 막막했다. 근데 구하고자 하는 것은 바로 최대 높이와 최소 높이의 차이값이므로 이를 생각하면 정말 쉽게 풀리는 문제였다.
문제에서 가로가 100이라는 말은 크기가 100인 1차원 배열이 있다는 뜻이다. 즉, 상자를 100개 담을 수 있는 배열이 있는데 각각 높이가 다르다. 따라서, 모든 상자를 담아준 후 오름차순으로 정렬해준다. 그렇게 되면 box[0]이 가장 낮은 높이, box[SIZE-1]이 가장 높은 높이를 가진 상자가 되기 때문이다. 따라서, box[SIZE-1]의 값을 하나 줄이고 box[0]의 값을 하나 키우게 되면 평탄화 작업이 수행된다. 입력받은 dump횟수만큼 평탄화를 진행해야 하므로 while()문을 사용해 앞의 과정을 반복한다. 그리고 수행할때마다 Answer = box[SIZE-1] - box[0]을 넣어준다.
문제에 따르면 높이의 차가 0,1이 되면 평탄화가 완료된 것이므로 조건문을 걸어 빠져나올 수 있도록 한다. 이렇게 쉽게 구하고자 하는 높이의 차에만 집중을 하면 굳이 2차원 배열을 쓰지 않아도 풀리는 문제이다.
코드
import java.util.*;
public class Swea_1208 {
final static int SIZE = 100;
final static int T = 10;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for (int tc = 0; tc < T; tc++) {
int dump = sc.nextInt(); // 덤프횟수
int[] box = new int[SIZE];
for (int i = 0; i < SIZE; i++)
box[i] = sc.nextInt();
Arrays.sort(box); // 오름차순
int Answer = 0; // 최고점 - 최저점
while (dump > 0) {
Answer = box[SIZE - 1] - box[0];
if (Answer == 0 || Answer == 1)
break; // 평탄화가 완료되면(차이가 0,1)이면 중단
box[SIZE - 1]--;
box[0]++;
Arrays.sort(box);
dump--;
}
System.out.println("#" + (tc + 1) + " " + Answer);
}
}
}