notepad by Oxix

[S4] 화살표 그리기 본문

Algorithm/Baekjoon

[S4] 화살표 그리기

Oxix 2022. 9. 26. 19:53

문제 풀이

직선 위에 점은  위치와 색깔을 나타낸다. (위치,색깔) 위치는 최대 10만까지 색깔은 300개까지  최대 가능하다. 점을 지나칠때 마다 모두 검사를 한다면 제한 시간 2초 (약 2억번)에는 불가능하다. 이유는 O(n) * n 이기 때문에 2억번을 넘는다. 그렇기 때문에 색상 별로 나누고 정렬한다.  가장 가까운 원소는 양 옆에 있기 때문에 하나를 고르면 된다. 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

public class 화살표그리기_15970 {
    static StringBuilder sb = new StringBuilder();
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static ArrayList[] lists;
    static StringTokenizer st;
    static int T, sum;

    public static void main(String[] args) throws IOException {
        init();
        calc();
        sb.append(sum);
        System.out.println(sb.toString());
    }

    private static void calc() {
        for (int j = 1; j <= T; j++) {
            for (int i = 0; i < lists[j].size(); i++) {
                if (i == 0) {
                    sum += lists[j].get(1) - lists[j].get(i);
                } else if (i == lists[j].size() - 1) {
                    sum += lists[j].get(i) - lists[j].get(i - 1);
                } else {
                    sum += Math.min(lists[j].get(i) - lists[j].get(i - 1), lists[j].get(i + 1) - lists[j].get(i));
                }
            }
        }

    }

    private static void init() throws IOException {
        T = Integer.parseInt(br.readLine());
        lists = new ArrayList[T + 1];
        for (int i = 1; i <= T; i++) {
            lists[i] = new ArrayList<>();
        }
        for (int i = 0; i < T; i++) {
            st = new StringTokenizer(br.readLine());
            int point = Integer.parseInt(st.nextToken());
            int color = Integer.parseInt(st.nextToken());
            System.out.println("point : " + point + " , color : " + color);
            lists[color].add(point);
        }

        for (int i = 1; i <= T; i++) {
            Collections.sort(lists[i]);
        }
    }
}
 
www.acmicpc.net

'Algorithm > Baekjoon' 카테고리의 다른 글

[S4] 카드  (0) 2022.09.26
[S4] 수열 정렬 - 1015  (0) 2022.09.15
[S2] 부분수열의 합 - 1182  (0) 2022.09.15
[백준] 퇴사 - 14501 S3  (0) 2022.06.29
[백준]바닥 장식_1388_DFS_난이도 : S3  (0) 2022.06.08