알고리즘/백준

백준 15970 - 화살표 그리기

[문제 바로가기]

1. 유형

정렬, 브루트포스

 

2. 풀이

점의 범위가 100000이기 때문에 O(N^2)이면 시간초과입니다.

따라서 동적프로그래밍을 썼습니다.

 

설계

1) 위치 순서대로 입력값 정렬

2) 색깔별로 큐 배열 만들고, 같은 색 끼리 큐에 삽입(굳이 큐를 사용안하고 배열 사용해도 됨)

3) 같은 색 끼리의 위치를 빼서 DP에 최소값 저장

 

예제1을 기준으로 설명하면, 색깔1의 위치는 0, 3, 5 순서로 입력됩니다.

0과 3의 차이는 3이고, DP[0]=3, DP[3]=3 을 입력.

3과 5의 차이는 2이고, DP[3]=2 (기존 값이 3이었는데, 2가 더 작으므로 초기화), DP[5]=2

 

위 과정을 색깔별로 해주면 됩니다.

 

3. 코드

import java.io.*;
import java.util.*;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = stoi(st.nextToken());
		int M = 100001;
		Queue<Integer> q[] = new LinkedList[N + 1];
		for (int i = 0; i <= N; i++) {
			q[i] = new LinkedList<>();
		}
		int dp[] = new int[M];
		for(int i=0; i<M; i++) {
			dp[i] = 987654321;
		}
		Queue<int[]> pq = new PriorityQueue<>((int[] a,int[] b)->{
			return a[0]-b[0];
		});
		int maxindex=0;
		for(int i=0; i<N; i++) {
			st = new StringTokenizer(br.readLine());
			int pos = stoi(st.nextToken());
			int color = stoi(st.nextToken());
			pq.add(new int[] {pos, color});
			maxindex = Math.max(maxindex, pos);
		}
		while (N-- > 0) {
			int arr[] = pq.poll();
			int pos = arr[0];
			int color=arr[1];
			if (!q[color].isEmpty()) {
				int pos2 = q[color].poll();
				int minval = Math.abs(pos-pos2);
				if(dp[pos] > minval) {
					dp[pos] =minval;
				}
				if(dp[pos2] > minval) {
					dp[pos2] = minval;
				}
			}
			q[color].add(pos);
		}
		int sum=0;
		for(int i=0; i<=maxindex; i++) {
			if(987654321 == dp[i]) continue;
			sum+=dp[i];
		}
		System.out.println(sum);
	}

	static int stoi(String s) {
		return Integer.valueOf(s);
	}
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 16439 - 치킨치킨치킨  (0) 2021.11.10
백준 16439 - 치킨치킨치킨  (0) 2021.11.10
백준 16987 - 계란으로 계란치기  (0) 2021.11.03
백준 16953 - A -> B  (0) 2021.11.02
백준 5883 - 아이폰 9S  (0) 2021.10.31