[Algorithm] ๐Ÿฆ•๋ฐฑ์ค€ 2304 ์ฐฝ๊ณ  ๋‹ค๊ฐํ˜•

HaJingJingยท2021๋…„ 8์›” 31์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
111/119

0. ๋ฌธ์ œ

N ๊ฐœ์˜ ๋ง‰๋Œ€ ๊ธฐ๋‘ฅ์ด ์ผ๋ ฌ๋กœ ์„ธ์›Œ์ ธ ์žˆ๋‹ค. ๊ธฐ๋‘ฅ๋“ค์˜ ํญ์€ ๋ชจ๋‘ 1 m์ด๋ฉฐ ๋†’์ด๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ธฐ๋‘ฅ๋“ค์„ ์ด์šฉํ•˜์—ฌ ์–‘์ฒ ๋กœ ๋œ ์ฐฝ๊ณ ๋ฅผ ์ œ์ž‘ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ฐฝ๊ณ ์—๋Š” ๋ชจ๋“  ๊ธฐ๋‘ฅ์ด ๋“ค์–ด๊ฐ„๋‹ค. ์ด ์ฐฝ๊ณ ์˜ ์ง€๋ถ•์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งŒ๋“ ๋‹ค.

์ง€๋ถ•์€ ์ˆ˜ํ‰ ๋ถ€๋ถ„๊ณผ ์ˆ˜์ง ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ๋ชจ๋‘ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•œ๋‹ค.
์ง€๋ถ•์˜ ์ˆ˜ํ‰ ๋ถ€๋ถ„์€ ๋ฐ˜๋“œ์‹œ ์–ด๋–ค ๊ธฐ๋‘ฅ์˜ ์œ—๋ฉด๊ณผ ๋‹ฟ์•„์•ผ ํ•œ๋‹ค.
์ง€๋ถ•์˜ ์ˆ˜์ง ๋ถ€๋ถ„์€ ๋ฐ˜๋“œ์‹œ ์–ด๋–ค ๊ธฐ๋‘ฅ์˜ ์˜†๋ฉด๊ณผ ๋‹ฟ์•„์•ผ ํ•œ๋‹ค.
์ง€๋ถ•์˜ ๊ฐ€์žฅ์ž๋ฆฌ๋Š” ๋•…์— ๋‹ฟ์•„์•ผ ํ•œ๋‹ค.

๋น„๊ฐ€ ์˜ฌ ๋•Œ ๋ฌผ์ด ๊ณ ์ด์ง€ ์•Š๋„๋ก ์ง€๋ถ•์˜ ์–ด๋–ค ๋ถ€๋ถ„๋„ ์˜ค๋ชฉํ•˜๊ฒŒ ๋“ค์–ด๊ฐ„ ๋ถ€๋ถ„์ด ์—†์–ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ฆผ 1์€ ์ฐฝ๊ณ ๋ฅผ ์˜†์—์„œ ๋ณธ ๋ชจ์Šต์„ ๊ทธ๋ฆฐ ๊ฒƒ์ด๋‹ค. ์ด ๊ทธ๋ฆผ์—์„œ ๊ตต์€ ์„ ์œผ๋กœ ํ‘œ์‹œ๋œ ๋ถ€๋ถ„์ด ์ง€๋ถ•์— ํ•ด๋‹น๋˜๊ณ , ์ง€๋ถ•๊ณผ ๋•…์œผ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ๋‹ค๊ฐํ˜•์ด ์ฐฝ๊ณ ๋ฅผ ์˜†์—์„œ ๋ณธ ๋ชจ์Šต์ด๋‹ค. ์ด ๋‹ค๊ฐํ˜•์„ ์ฐฝ๊ณ  ๋‹ค๊ฐํ˜•์ด๋ผ๊ณ  ํ•˜์ž.

๊ทธ๋ฆผ1 . ๊ธฐ๋‘ฅ๊ณผ ์ง€๋ถ•(๊ตต์€ ์„ )์˜ ์˜ˆ

์ฐฝ๊ณ  ์ฃผ์ธ์€ ์ฐฝ๊ณ  ๋‹ค๊ฐํ˜•์˜ ๋ฉด์ ์ด ๊ฐ€์žฅ ์ž‘์€ ์ฐฝ๊ณ ๋ฅผ ๋งŒ๋“ค๊ธฐ๋ฅผ ์›ํ•œ๋‹ค. ๊ทธ๋ฆผ 1์—์„œ ์ฐฝ๊ณ  ๋‹ค๊ฐํ˜•์˜ ๋ฉด์ ์€ 98 ใŽก์ด๊ณ , ์ด ๊ฒฝ์šฐ๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ์ฐฝ๊ณ  ๋‹ค๊ฐํ˜•์ด๋‹ค.

๊ธฐ๋‘ฅ๋“ค์˜ ์œ„์น˜์™€ ๋†’์ด๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ๊ฐ€์žฅ ์ž‘์€ ์ฐฝ๊ณ  ๋‹ค๊ฐํ˜•์˜ ๋ฉด์ ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ
์ฒซ ์ค„์—๋Š” ๊ธฐ๋‘ฅ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 1 ์ด์ƒ 1,000 ์ดํ•˜์ด๋‹ค. ๊ทธ ๋‹ค์Œ N ๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ์ค„์— ๊ฐ ๊ธฐ๋‘ฅ์˜ ์™ผ์ชฝ ๋ฉด์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ L๊ณผ ๋†’์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ H๊ฐ€ ํ•œ ๊ฐœ์˜ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. L๊ณผ H๋Š” ๋‘˜ ๋‹ค 1 ์ด์ƒ 1,000 ์ดํ•˜์ด๋‹ค.

์ถœ๋ ฅ
์ฒซ ์ค„์— ์ฐฝ๊ณ  ๋‹ค๊ฐํ˜•์˜ ๋ฉด์ ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

1. ์•„์ด๋””์–ด

๐Ÿ’ก ๊ฐ€์žฅ ํฐ ๊ธฐ๋‘ฅ์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฅธ์ชฝ๊ณผ ์™ผ์ชฝ์„ ๋‚˜๋ˆ”
๐Ÿ’ก ์™ผ์ชฝ์€ ๊ธฐ๋‘ฅ์ด ์ปค์ง€๋Š” ๊ตฌ๊ฐ„๋งŒ ์ €์žฅํ•˜๊ณ  ์˜ค๋ฅธ์ชฝ์€ ๊ธฐ๋‘ฅ์ด ์ž‘์•„์ง€๋Š” ๊ตฌ๊ฐ„๋งŒ ์ €์žฅํ•จ
๐Ÿ’ก ๋งˆ์ง€๋ง‰์œผ๋กœ ์ œ์ผ ๊ธด ๊ธฐ๋‘ฅ์„ ๋”ํ•ด์คŒ
๐Ÿ’ก ์˜ˆ์™ธ์ฒ˜๋ฆฌ
1) ์ œ์ผ ๊ธด ๊ธฐ๋‘ฅ์ด ์—ฌ๋Ÿฌ ๊ฐœ ์ผ ๋•Œ, ๋„“์ด๊ฐ€ ์ค‘๋ณต๋˜์–ด์„œ ๋”ํ•ด์ง€๋Š” ๋ฌธ์ œ์  ๋ฐœ์ƒ
โ†’ left.contains(arr[i])๋ฅผ ํ•˜์—ฌ right์— ์ค‘๋ณต๋œ ๊ธฐ๋‘ฅ์ด ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•˜๊ฒŒ ํ•จ
2) 1๋กœ ์ธํ•ด, right์— ์ œ์ผ ๊ธด ๊ธฐ๋‘ฅ์ด ํ•˜๋‚˜์ผ ๋•Œ๋„ ๋“ค์–ด์˜ค์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒ
โ†’ ์ „์ฒด์—์„œ ๊ฐ€์žฅ ๊ธด ๊ธฐ๋‘ฅ๊ณผ ์˜ค๋ฅธ์ชฝ์—์„œ ๊ฐ€์žฅ ๊ธด ๊ธฐ๋‘ฅ ์‚ฌ์ด์˜ ๋„“์ด๋ฅผ ๊ตฌํ•ด์คŒ

2. ํ•ต์‹ฌ ํ’€์ด

  1. ๊ฐ€์žฅ ํฐ ๊ธฐ๋‘ฅ์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฅธ์ชฝ๊ณผ ์™ผ์ชฝ์„ ๋‚˜๋ˆ”
ArrayList<Wood> left = new ArrayList<>();
ArrayList<Wood> right = new ArrayList<>();
  1. ์™ผ์ชฝ์€ ๊ธฐ๋‘ฅ์ด ์ปค์ง€๋Š” ๊ตฌ๊ฐ„๋งŒ ์ €์žฅํ•˜๊ณ  ์˜ค๋ฅธ์ชฝ์€ ๊ธฐ๋‘ฅ์ด ์ž‘์•„์ง€๋Š” ๊ตฌ๊ฐ„๋งŒ ์ €์žฅํ•จ
Wood tmp = left.get(0);
for(int i=1; i<left.size(); i++) {
	Wood cur = left.get(i);
	sum += Math.abs(cur.x - tmp.x)*tmp.y;
	tmp = cur;
}
...
for(int i=N-1; i>=0; i--) {
	if(max <= arr[i].y) {
		max = arr[i].y;
		if(!left.contains(arr[i])) {	
			right.add(arr[i]);
		}
	}
}
  1. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ œ์ผ ๊ธด ๊ธฐ๋‘ฅ์„ ๋”ํ•ด์คŒ
sum += left.get(left.size()-1).y;
  1. left.contains(arr[i])๋ฅผ ํ•˜์—ฌ right์— ์ค‘๋ณต๋œ ๊ธฐ๋‘ฅ์ด ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•˜๊ฒŒ ํ•จ
if(!left.contains(arr[i])) {	
	right.add(arr[i]);
}
  1. ์ „์ฒด์—์„œ ๊ฐ€์žฅ ๊ธด ๊ธฐ๋‘ฅ๊ณผ ์˜ค๋ฅธ์ชฝ์—์„œ ๊ฐ€์žฅ ๊ธด ๊ธฐ๋‘ฅ ์‚ฌ์ด์˜ ๋„“์ด๋ฅผ ๊ตฌํ•ด์คŒ
sum += Math.abs(left.get(left.size()-1).x-right.get(right.size()-1).x)*right.get(right.size()-1).y;

3. ์ฝ”๋“œ

import java.io.*;
import java.util.*;
public class BOJ_2304 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int N = Integer.parseInt(br.readLine());
		Wood[] arr = new Wood[N];
		ArrayList<Wood> left = new ArrayList<>();
		ArrayList<Wood> right = new ArrayList<>();
		
		for(int i=0; i< N; i++) {
			String[] s = br.readLine().split(" ");
			arr[i] = new Wood(Integer.parseInt(s[0]), Integer.parseInt(s[1]));
		}
		
		Arrays.sort(arr);
		
		int max = -1;
		int sum = 0;
		for(int i=0; i<N; i++) {
			if(max <= arr[i].y) {
				max = arr[i].y;
				left.add(arr[i]);
			}
		}
		
		Wood tmp = left.get(0);
		for(int i=1; i<left.size(); i++) {
			Wood cur = left.get(i);
			sum += Math.abs(cur.x - tmp.x)*tmp.y;
			tmp = cur;
		}
		
		if(!left.contains(arr[arr.length-1])) {
			max = -1;
			for(int i=N-1; i>=0; i--) {
				if(max <= arr[i].y) {
					max = arr[i].y;
					if(!left.contains(arr[i])) {	
						right.add(arr[i]);
					}
				}
			}
			
			tmp = right.get(0);
			sum += Math.abs(left.get(left.size()-1).x-right.get(right.size()-1).x)*right.get(right.size()-1).y;
			for(int i=1; i<right.size(); i++) {
				Wood cur = right.get(i);
				sum += Math.abs(cur.x - tmp.x)*tmp.y;
				tmp = cur;
			}
		}
		
		sum += left.get(left.size()-1).y;
		
		System.out.println(sum);
	}

	static class Wood implements Comparable<Wood>{
		int x;
		int y;
		
		Wood(int x, int y){
			this.x = x;
			this.y = y;
		}
		
		@Override
		public int compareTo(Wood w) {
			return this.x - w.x;
		};
		
	}
}

4. ๊ฒฐ๊ณผ

์„ฑ๊ณตโœจ

profile
๐ŸŒฑ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€