알고리즘/백준
11497번 : 통나무 건너뛰기
코딍코딍
2022. 7. 20. 17:35
https://www.acmicpc.net/problem/11497
11497번: 통나무 건너뛰기
남규는 통나무를 세워 놓고 건너뛰기를 좋아한다. 그래서 N개의 통나무를 원형으로 세워 놓고 뛰어놀려고 한다. 남규는 원형으로 인접한 옆 통나무로 건너뛰는데, 이때 각 인접한 통나무의 높이
www.acmicpc.net
문제
코드
import java.io.*;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int t = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for(int i=0;i<t;i++) {
int num = Integer.parseInt(br.readLine());
String woodStr[] = br.readLine().split(" ");
Integer woodInt[] = new Integer[num];
int line[] = new int[num];
for(int j=0;j<num;j++) {
woodInt[j] = Integer.parseInt(woodStr[j]);
}
Arrays.sort(woodInt);
int index=0;
for(int j=0;j<num;j++) {
if(j%2==0) line[index++] = woodInt[j];
else line[num - index] = woodInt[j];
}
int max = 0;
for(int j=0;j<num;j++) {
if(max<Math.abs(line[j]-line[(j+1)%num]))
max = Math.abs(line[j]-line[(j+1)%num]);
}
sb.append(max+"\n");
}
bw.write(sb + ""); bw.flush();
}
}
해결방법
처음에 문제 이해가 잘 안 되서 5분동안 문제만 읽었다.
통나무 건너뛰기의 난이도는 인접한 두 통나무 간의 높이의 차의 최댓값인데 이 최댓값을 최소로 만드는 것이 이 문제의 핵심이다.
24579 를 25974로 만들었을 때 난이도가 가장 낮아진다. 25974를 계속 보다보니 규칙을 찾았다.
통나무 높이가 오름차순 정렬되있다고 가정할 때, 가장 작은 통나무부터 시작해 새로운 배열의 맨 왼쪽에다 두고 그 다음 통나무는 맨 오른쪽에다 두는 것을 반복하면 난이도가 가장 낮아지게 통나무를 나열할 수 있다.
예시)
2 4 5 7 9 10 13 15 17 19
2 5 9 7 4 10 15 19 17 13
나열 후에 난이도만 반복문을 통해 찾아주면 문제는 해결된다.
슈도코드
1. 테스트 수 입력받기
2. 테스트 수 만큼 반복
1. 통나무 수 입력받기
2. 통나무 높이 입력 받아서 오름차순 정렬
3. line배열에 좌우 번갈아 가면서 정렬된 통나무 놓기
4. 난이도 구하여 StringBuilder에 붙이기
3. 출력