

쌓을 때마다 60도 씩 돌아가는 콘센트 N개를 N층으로 쌓았을 때,
위에서 보이는 단자의 수의 최솟값을 찾는 문제이다.

모든 콘센트는 최소 2구이다.
위와 같이 콘센트의 2구들끼리 삼각형의 형태를 이루도록 쌓아가면 보이는 단자의 수를 최소로 만들 수 있다.
예시 1)
6
3 3 3 3 3 3
빨강 : 3 3
주황 : 3 3
청록 : 3 3
result : 6
각 각도 당 가장 긴 콘센트들의 길이의 합이 최소가 되도록 분배하면 된다.
예시 2)
10
2 2 3 4 5 5 6 7 8 9
빨강 : 2 2 3
주황 : 4 5 5
청록 : 6 7 8 9
result : 14
길이 순으로 정렬한 뒤 3등분하여 각 부분의 최대값을 추출한다.
int sIdx = N/3 - 1;
int mIdx = N/3*2 + N%3/2 - 1;
int lIdx = N/3*3 + N%3 - 1;
int s = arr.get(sIdx);
int m = arr.get(mIdx);
int l = arr.get(lIdx);
이후 겹치는 부분인 3을 빼고 출력한다.
System.out.println(s + m + l - 3);
위 로직은 콘센트가 3개 이상일 때 유효하다.
if (arr.size() == 1) {
System.out.println(arr.get(0));
return;
}
if (arr.size() == 2) {
System.out.println(arr.get(0) + arr.get(1) - 1);
return;
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class _28076 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
List<Integer> arr = Arrays.stream(br.readLine().split(" "))
.map(Integer::parseInt)
.sorted()
.collect(Collectors.toList());
if (arr.size() == 1) {
System.out.println(arr.get(0));
return;
}
if (arr.size() == 2) {
System.out.println(arr.get(0) + arr.get(1) - 1);
return;
}
int sIdx = N/3 - 1;
int mIdx = N/3*2 + N%3/2 - 1;
int lIdx = N/3*3 + N%3 - 1;
int s = arr.get(sIdx);
int m = arr.get(mIdx);
int l = arr.get(lIdx);
System.out.println(s + m + l - 3);
}
}