문제
세준시에는 고층 빌딩이 많다. 세준시의 서민 김지민은 가장 많은 고층 빌딩이 보이는 고층 빌딩을 찾으려고 한다. 빌딩은 총 N개가 있는데, 빌딩은 선분으로 나타낸다. i번째 빌딩 (1부터 시작)은 (i,0)부터 (i,높이)의 선분으로 나타낼 수 있다. 고층 빌딩 A에서 다른 고층 빌딩 B가 볼 수 있는 빌딩이 되려면, 두 지붕을 잇는 선분이 A와 B를 제외한 다른 고층 빌딩을 지나거나 접하지 않아야 한다. 가장 많은 고층 빌딩이 보이는 빌딩을 구하고, 거기서 보이는 빌딩의 수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 빌딩의 수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에 1번 빌딩부터 그 높이가 주어진다. 높이는 1,000,000,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 문제의 정답을 출력한다.
예제 입력 1 복사
15
1 5 3 2 6 3 2 6 4 2 5 7 3 1 5
예제 출력 1 복사
7
예제 입력 2 복사
1
10
예제 출력 2 복사
0
예제 입력 3 복사
4
5 5 5 5
예제 출력 3 복사
2
예제 입력 4 복사
5
1 2 7 3 2
예제 출력 4 복사
4
예제 입력 5 복사
10
1000000000 999999999 999999998 999999997 999999996 1 2 3 4 5
예제 출력 5 복사
6
풀이
정답을 봐버린 문제.
정말 왼쪽, 오른쪽으로 나눠서 탐색하는데 까지는 생각해서 기울기를 구하는 식을 찾아봤었다.
근데 계속 틀리더라? 왜지? 하고 봤더니 왼쪽은 기울기가 감소하는 모양, 오른쪽은 기울기가 증가하는 모양이라더라. 여기까진 신경쓰지 못했다.
여튼, 계속 기울기를 구하면서 왼쪽으로 갈 때는 기울기가 작아지면 갱신하고, 오른쪽으로 갈 때는 기울기가 커지면 갱신하면서 카운트를 세면 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BJ_1027_고층건물 {
static int N;
static int[] map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
map = new int[N];
for(int i=0; i<N; i++)
{
map[i] = Integer.parseInt(st.nextToken());
}
int ans=0;
for(int i=0; i<N; i++)
{
ans = Math.max(ans, count(i));
}
System.out.println(ans);
}
public static int count(int index)
{
int cnt=0;
double temp=0;
for(int i=index-1; i>=0; i--)
{
double slope = (double)(map[index]-map[i])/(index-i);
if(i==index-1 || temp>slope)
{
cnt++;
temp = slope;
}
}
for(int i=index+1; i<N; i++)
{
double slope = (double)(map[index]-map[i])/(index-i);
if(i==index+1 || temp<slope)
{
cnt++;
temp = slope;
}
}
return cnt;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 1522 - 문자열 교환(Java) (0) | 2024.04.26 |
---|---|
백준 2531 - 회전초밥 (Java) (0) | 2024.04.25 |
백준 1138 - 한 줄로 서기(Java) (0) | 2024.04.23 |
백준 7682 - 틱택토 (Java) (0) | 2024.04.22 |
백준 11501 - 주식 (Java) (1) | 2024.04.22 |