쉬운 비교문제입니다. 왼쪽 2칸, 오른쪽 2칸 검사해서 크기차이를 구하면 됩니다.
public static int checkLeft(int[] buildings, int index) {
int gap1, gap2;
int res;
gap1 = buildings[index] - buildings[index - 1];
gap2 = buildings[index] - buildings[index - 2];
if (gap1 > gap2)
res = gap2;
else
res = gap1;
if (res < 0)
return 0;
return res;
}
왼쪽, 오른쪽 나눠서 검사합니다.
왼쪽을 기준으로 말씀드리면, 왼쪽 2칸을 각각 기준 빌딩과 차이를 구합니다. 더 작은 차이가 결국 조망권이 확보된 세대겠죠? 이걸 이제 오른쪽에서도 구해서 비교한 뒤에, 더 작은 값을 조망권이 확보된 세대로 정합니다.
import java.util.*;
import java.io.*;
class Solution
{
public static void main(String args[]) throws Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int building;
int view;
int[] buildings;
for(int test_case = 1; test_case <= 10; test_case++)
{
building = Integer.parseInt(br.readLine());
buildings = new int[building + 4];
view = 0;
// input
st = new StringTokenizer(br.readLine());
for (int i = 0; i < building; i++) {
buildings[i] = Integer.parseInt(st.nextToken());
}
// logic
for (int i = 2; i <= building - 2; i++) {
view += getView(buildings, i);
}
System.out.println("#" + test_case + " " + view);
}
}
public static int getView(int[] buildings, int index) {
int res;
int left = checkLeft(buildings, index);
int right = checkRight(buildings, index);
if (left < right)
res = left;
else
res = right;
return res;
}
public static int checkLeft(int[] buildings, int index) {
int gap1, gap2;
int res;
gap1 = buildings[index] - buildings[index - 1];
gap2 = buildings[index] - buildings[index - 2];
if (gap1 > gap2)
res = gap2;
else
res = gap1;
if (res < 0)
return 0;
return res;
}
public static int checkRight(int[] buildings, int index) {
int gap1, gap2;
int res;
gap1 = buildings[index] - buildings[index + 1];
gap2 = buildings[index] - buildings[index + 2];
if (gap1 > gap2)
res = gap2;
else
res = gap1;
if (res < 0)
return 0;
return res;
}
}
삼성은 난이도가 같아도 차이가 심하네요.