반응형
https://www.acmicpc.net/problem/1027
[ 문제풀이 ]
N이 최대 50이기 때문에 모든 빌딩을 빌딩 위치부터 좌측(우측)을 탐색하면서 가장 최근에 구한 고층빌딩의 기울기보다 작은(큰) 빌딩들의 개수를 구해주면 된다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
static int N, answer;
static double[] building;
static Stack<Double> stack;
public static void main(String[] args) throws IOException {
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))) {
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
building = new double[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; ++i) {
building[i] = Double.parseDouble(st.nextToken());
}
stack = new Stack<>();
for (int i = 0; i < N; ++i) {
answer = Math.max(answer, solve(i));
stack.clear();
}
bw.write(answer + "\n");
} catch (Exception e) {
e.printStackTrace();
}
}
public static int solve(int pos) {
//기준점 좌측
for (int i = pos - 1; i >= 0; --i) {
double slope = (building[pos] - building[i]) / (pos - i);
if (i == pos - 1 || stack.peek() > slope) {
stack.push(slope);
}
}
//기준점 우측
for (int i = pos + 1; i < N; ++i) {
double slope = (building[i] - building[pos]) / (i - pos);
if (i == pos + 1 || stack.peek() < slope) {
stack.push(slope);
}
}
return stack.size();
}
}
반응형
'Problem Solving > 백준' 카테고리의 다른 글
백준 4195 : 친구 네트워크 (0) | 2021.08.02 |
---|---|
백준 15486 : 퇴사 2 (0) | 2021.08.01 |
백준 1461 : 도서관 (0) | 2021.07.31 |
백준 14621 : 나만 안되는 연애 (0) | 2021.07.28 |
백준 2169 : 로봇 조종하기 (0) | 2021.07.27 |
댓글