알고리즘/백준

백준 1027 - 고층 건물 (Java)

2024. 4. 24. 21:33

문제

세준시에는 고층 빌딩이 많다. 세준시의 서민 김지민은 가장 많은 고층 빌딩이 보이는 고층 빌딩을 찾으려고 한다. 빌딩은 총 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
'알고리즘/백준' 카테고리의 다른 글
  • 백준 1522 - 문자열 교환(Java)
  • 백준 2531 - 회전초밥 (Java)
  • 백준 1138 - 한 줄로 서기(Java)
  • 백준 7682 - 틱택토 (Java)
D_Helloper
D_Helloper
안녕_개발
D_Helloper
Hello_Develop
D_Helloper
전체
오늘
어제
  • 분류 전체보기 (116) N
    • CS (23)
      • 네트워크 (16)
      • 운영체제 (6)
    • 알고리즘 (48)
      • 백준 (39)
      • 프로그래머스 (7)
      • SWEA (1)
    • DB (6)
      • SQLD (2)
      • DataBase (4)
    • JAVA (13)
    • ETC (16)
    • 일상 (5)
    • Develop (4) N
      • Docker (1)
      • TIL (1) N

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Contact

인기 글

태그

  • 네트워크 계층
  • HTTP 메소드
  • REST
  • Internet 5계층
  • CRUD
  • HTTP
  • OSI 계층
  • restful
  • HTTP 상태코드
  • http method
  • OSI 7계층
  • REST API
  • TCP/IP 5계층

최근 댓글

최근 글

hELLO · Designed By 정상우.
D_Helloper
백준 1027 - 고층 건물 (Java)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.