📌 고정 게시글

📢 공지합니다

이 게시글은 메인 페이지에 항상 고정되어 표시됩니다.

최코딩의 개발

[백준 2304번] 창고 다각형 본문

코딩테스트/백준

[백준 2304번] 창고 다각형

seung_ho_choi.s 2024. 12. 22. 16:08
728x90

https://www.acmicpc.net/problem/2304

 

package datastructure;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class DataStructure2304 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        List<int[]> inputList = new LinkedList<>();
        List<Integer> p_point = new ArrayList<>();
        int h_point = 0;
        int N = Integer.parseInt(br.readLine());

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            int L = Integer.parseInt(st.nextToken());
            int H = Integer.parseInt(st.nextToken());
            if (h_point < H) {
                h_point = H;
                p_point=new ArrayList<>();
                p_point.add(L);
            }else if(h_point==H){
                p_point.add(L);
            }
            inputList.add(new int[]{L, H});
        }

        inputList.sort((e1, e2) -> {
            int key1 = e1[0];
            int key2 = e2[0];
            return key1 - key2;
        });

        int cnt = 0;
        int cnt2=0;
        for (int[] ints : inputList) {
            if (p_point.get(0) == ints[0]) {
                break;
            }
            cnt++;
        }

        for (int[] ints : inputList) {
            if (p_point.get(p_point.size()-1) == ints[0]) {
                break;
            }
            cnt2++;
        }

        int pointFront = cnt;
        int pointBack = cnt2;
        int sum = 0;

        int height_l = 0;
        int place_l = 0;
        for (int i = 0; i <= pointFront; i++) {
            int[] input = inputList.get(i);
            if (i == 0) {
                height_l = input[1];
                place_l = input[0];
            } else if (input[1] > height_l) {
                sum += (input[0] - place_l) * height_l;
                height_l = input[1];
                place_l = input[0];
            }
        }


        int height_r = 0;
        int place_r = 0;
        for (int i = N - 1; i >= pointBack; i--) {
            int[] input = inputList.get(i);
            if (i == N - 1) {
                height_r = input[1];
                place_r = input[0];
            } else if (input[1] > height_r) {
                sum += Math.abs((input[0] - place_r) * height_r);
                height_r = input[1];
                place_r = input[0];
            }
        }

        int width=Math.abs(p_point.get(0)- p_point.get(p_point.size()-1))+1;
        sum += (h_point)*width;

        System.out.println(sum);
    }
}

 

문제 설명이 빈약해서 조금 해맸다. 

나는 먼저 가장 높은 층의 기둥들을 list에 담아서 넣었고 높은 층 기둥의 첫번째 요소랑 마지막 요소를 비교 기준으로 삼아 

for문을 돌려       -> ????? <-             이런식으로 알고리즘을 설계했다.

근데 코드가 너무 복잡한거 같아서 다른 사람들꺼 참고했는데 배열에 싹다 넣어서 알고리즘을 설계하는게 더 효율적인것을 보았다.   

728x90

'코딩테스트 > 백준' 카테고리의 다른 글

[백준 16928번] 뱀과 사다리 게임  (0) 2024.12.23
[백준 1967] 숨바꼭질  (0) 2024.12.22
[백준 11501번] 주식  (0) 2024.12.21
[백준 20006번] 랭킹전 대기열  (1) 2024.12.20
[백준 22233번] 가희와 키워드  (0) 2024.12.20