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

 

20440๋ฒˆ: ๐ŸŽต๋‹ˆ๊ฐ€ ์‹ซ์–ด ์‹ซ์–ด ๋„ˆ๋ฌด ์‹ซ์–ด ์‹ซ์–ด ์˜ค์ง€ ๋งˆ ๋‚ด๊ฒŒ ์ฐ์ฉ๋Œ€์ง€๋งˆ๐ŸŽต - 1

์ฒซ์งธ ์ค„์— ์ง€๋™์ด์˜ ๋ฐฉ์— ์ถœ์ž…ํ•œ ๋ชจ๊ธฐ์˜ ๋งˆ๋ฆฟ์ˆ˜ N(1 โ‰ค N โ‰ค 1,000,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์— ๋ชจ๊ธฐ์˜ ์ž…์žฅ ์‹œ๊ฐ TE๊ณผ ํ‡ด์žฅ ์‹œ๊ฐ TX์ด ์ฃผ์–ด์ง„๋‹ค. (0 โ‰ค TE < TX โ‰ค 2,100,000,000) ๋ชจ๊ธฐ๋Š” [TE, Tx)๋™

www.acmicpc.net

 

 

 

 

 

 

๋ฌธ์ œ

  • ๋ชจ๊ธฐ๋“ค์˜ ๋ฐฉ ์ž…์žฅ, ํ‡ด์žฅ ์‹œ๊ฐ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ๋ชจ๊ธฐ๋“ค์ด ๊ฐ€์žฅ ๋งŽ์ด ์žˆ๋Š” ์‹œ๊ฐ„๋Œ€์™€ ํ•ด๋‹น ์‹œ๊ฐ„๋Œ€์— ๋ชจ๊ธฐ๊ฐ€ ๋ช‡ ๋งˆ๋ฆฌ๊ฐ€ ์žˆ๋Š”์ง€ ๊ตฌํ•˜๊ธฐ

 

์ œํ•œ ์‚ฌํ•ญ

  • ๋ชจ๊ธฐ์˜ ๋งˆ๋ฆฟ์ˆ˜ N(1 โ‰ค N โ‰ค 1,000,000)
  • ๋ชจ๊ธฐ์˜ ์ž…์žฅ ์‹œ๊ฐ TE๊ณผ ํ‡ด์žฅ ์‹œ๊ฐ TX (0 โ‰ค TE < TX โ‰ค 2,100,000,000)
  • ๋ชจ๊ธฐ๋Š” [TE, Tx)๋™์•ˆ ์กด์žฌ

 

 

 

 

 

ํ’€์ด

์ฒ˜์Œ ์ƒ๊ฐ๋‚œ ํ’€์ด๋Š” ์ขŒํ‘œ๊ณ„๋ฅผ ๋ฐฐ์—ด๋กœ ํ‘œํ˜„ํ•ด์„œ, ํ•ด๋‹น ์ขŒํ‘œ์— ๋ชจ๊ธฐ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋ชจ๊ธฐ๊ฐ€ ์žˆ๋Š” ์—ฐ์†๋œ ๋ชจ๋“  ๊ตฌ๊ฐ„์— ๋ชจ๋‘ +1์„ ํ•ด์ฃผ๋ฉด, N๊ฐœ์˜ ๊ตฌ๊ฐ„๋งˆ๋‹ค ์ž…์žฅ ์‹œ๊ฐ๋ถ€ํ„ฐ ํ‡ด์žฅ ์‹œ๊ฐ ์ „๊นŒ์ง€ +1์„ ํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.

 

 

 

 

 ์ž…์žฅ ์‹œ๊ฐ๋ถ€ํ„ฐ ํ‡ด์žฅ์‹œ๊ฐ๊นŒ์ง€ ๋ชจ๋‘ +1์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ, ์‹œ์ž‘ ์‹œ๊ฐ์ด๋ฉด ํ•ด๋‹น ์ขŒํ‘œ์˜ ๊ฐ’์„ +1์„ ํ•ด์ฃผ๊ณ , ๋์ ์ด๋ฉด -1์„ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ขŒํ‘œ๋ณ„ ๋ชจ๊ธฐ ์ˆ˜๋ฅผ ๋ˆ„์ ํ•ด์„œ ๋”ํ•ด๋‚˜๊ฐ„๋‹ค.

 

 

 

 ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ์—์„œ๋Š” ์ขŒํ‘œ๊ณ„๋ฅผ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด์„œ ๋‚˜ํƒ€๋‚ธ๋‹ค๋ฉด OutOfMemoryErrorr ๋‚  ๊ฒƒ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ‡ด์žฅ ์‹œ๊ฐ์ด ์ตœ๋Œ€ 21์–ต์œผ๋กœ ๋งค์šฐ ํฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ขŒํ‘œ๊ณ„์˜ ๋ฒ”์œ„๊ฐ€ ์ž‘์€ ๊ฒฝ์šฐ์—๋Š” ์ƒ๊ด€์ด ์—†๊ฒ ์ง€๋งŒ, ๋ฒ”์œ„๊ฐ€ ํฐ ๊ฒฝ์šฐ์—๋Š” ์ขŒํ‘œ๊ณ„๋ฅผ ๋ฐฐ์—ด๋กœ ํ‘œํ˜„ํ•œ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„์—๋‹ค๊ฐ€ ํƒ์ƒ‰์„ ํ•˜๋Š”๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ์ด๋‹ค.

๋ฐฑ์ค€์—์„œ ์ด ๋ฌธ์ œ์˜ ์นดํ…Œ๊ณ ๋ฆฌ์— '์ขŒํ‘œ ์••์ถ•'์ด ์žˆ๋Š” ์ด์œ ๊ฐ€ ์žˆ๋‹ค.

 

 

 ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์ขŒํ‘œ์˜ ๋ฒ”์œ„๋ฅผ ๋ชจ๋‘ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋ชจ๊ธฐ์˜ ๋งˆ๋ฆฟ์ˆ˜๋Š” ์ตœ๋Œ€ 100๋งŒ์œผ๋กœ, ๋ชจ๋“  ์ž…์žฅ ์‹œ๊ฐ„๊ณผ ํ‡ด์žฅ ์‹œ๊ฐ„์„ ํ‘œํ˜„ํ•œ๋‹ค๋ฉด ์ตœ๋Œ€ 200๋งŒ๊ฐœ์˜ ์ขŒํ‘œ๊ฐ€ ์“ฐ์ผ ๊ฒƒ์ด๋‹ค. 21์–ต๋ณด๋‹ค๋Š” ๋งค์šฐ ์ž‘์€ ์ˆ˜์ด๋‹ค.

 

 

 

[๋ฐฉ๋ฒ•1] HashMap ์‚ฌ์šฉ

 

  • ์‹œ๊ฐ ๋ณ„ ๋ชจ๊ธฐ์ˆ˜ ์ €์žฅํ•˜๊ธฐ

 ๋ชจ๊ธฐ์˜ ์ž…์žฅ ์‹œ๊ฐ๊ณผ ํ‡ด์žฅ ์‹œ๊ฐ์„ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ, ์‹œ๊ฐ์„ key๋กœ ํ•˜๋Š” map์— ๋ชจ๊ธฐ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ฐฑ์‹ ํ•˜๋ฉด์„œ ์ €์žฅํ•œ๋‹ค.

 

  • key(์‹œ๊ฐ) ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ

๋ชจ๊ธฐ๊ฐ€ ์žˆ๋Š” ์‹œ๊ฐ๋ณ„ ๋ชจ๊ธฐ์˜ ์ˆ˜๋ฅผ ๋ˆ„์ ํ•ด์„œ ํ•ฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์‹œ๊ฐ(key) ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ map์„ ์ •๋ ฌํ•œ๋‹ค.

 

  • key(์‹œ๊ฐ)์— ํ•ด๋‹นํ•˜๋Š”  value(๋ชจ๊ธฐ์ˆ˜) ๋ˆ„์ ํ•ฉ ๊ตฌํ•˜๊ธฐ, ์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹ ํ•˜๊ธฐ

 ์ •๋ ฌ๋œ key๊ฐ’์ธ ๋ชจ๊ธฐ๊ฐ€ ์žˆ๋Š” ์‹œ๊ฐ์„ ๋ชจ๋‘ ์ˆœํšŒํ•˜๋ฉฐ ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•ด๋‚˜๊ฐ„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ˆ„์ ํ•ฉ์ด ์ตœ๋Œ“๊ฐ’์ด๋ฉด max๋ฅผ ๊ฐฑ์‹ ํ•ด์ฃผ๊ณ , ์ž…์žฅ ์‹œ๊ฐ๋„ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ๋Œ€ ๊ตฌ๊ฐ„์—์„œ ๊ฐ’์ด ๋ฐ”๋€Œ๋Š” ์ง€์ ์ด๋ฉด ํ‡ด์žฅ ์‹œ๊ฐ์„ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค. 

 

 

 

 

์ฝ”๋“œ

package algorithm;

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

public class BOJ_๋‹ˆ๊ฐ€์‹ซ์–ด์‹ซ์–ด {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine()); //๋ชจ๊ธฐ ๋งˆ๋ฆฟ์ˆ˜

		HashMap<Integer, Integer> map = new HashMap<>();
		
		for(int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");

			int TE = Integer.parseInt(st.nextToken());
			int TX = Integer.parseInt(st.nextToken());
			
			map.put(TE, map.getOrDefault(TE, 0) + 1);
			map.put(TX, map.getOrDefault(TX, 0) - 1);
		}
		
		//๋งต ํ‚ค ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
		List<Integer> keyList = new ArrayList<>(map.keySet());
		keyList.sort((o1, o2) -> o1 - o2);
		
		int sum = 0;
		int max = 0;
		int ans_start = 0, ans_end = 0;
		
		//๋งต ์ˆœํšŒํ•˜๋ฉฐ ์ฐพ๊ธฐ
		boolean opened = false; //์ตœ๋Œ€ ๊ตฌ๊ฐ„์ด ์—ด๋ ธ๋Š”์ง€
		
		for(int key : keyList) {
			sum += map.get(key); //+1 or -1๊ฐ’์„ ๋ˆ„์ ์‹œํ‚ด
			
			if(sum > max) { //์ตœ๋Œ“๊ฐ’์ด ๋‚˜์˜ค๋ฉด ๊ฐฑ์‹ 
				max = sum;
				ans_start = key;
				opened = true;
			} else if(sum < max && opened) { //์ตœ๋Œ€ ๊ตฌ๊ฐ„์—์„œ ๊ฐ’์ด ๋ฐ”๋€Œ๋Š” ์ง€์ ์ด๋ฉด
				ans_end = key;
				opened = false; //๊ตฌ๊ฐ„ ๋‹ซ์Œ
			}
		}
		
		System.out.println(max);
		System.out.println(ans_start + " " + ans_end);
	}

}

 

 

1500ms๋Œ€๋กœ 800~900ms๋Œ€์˜ ํ’€์ด๋ณด๋‹ค๋Š” ๊ฝค ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค.

 

๋น„์Šทํ•œ ๋กœ์ง์ธ๋ฐ, map์— ์ €์žฅํ•˜๋Š” ๊ณผ์ •์—์„œ map์— ์žˆ๋Š” key์˜ value๋ฅผ ์ฐพ๊ณ , ๊ฐฑ์‹ ํ•ด์„œ ๋‹ค์‹œ ์ €์žฅํ•˜๋Š” ์ž‘์—…์„ ํ•˜๋‹ˆ ์‹œ๊ฐ„์ด ๊ฝค ๋“œ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

 

 

 

 

[๋ฐฉ๋ฒ•2] 2 * N ํฌ๊ธฐ์˜ ๋ฐฐ์—ด ์‚ฌ์šฉ

 

  • ์‹œ๊ฐ๊ณผ ์ž…ํ‡ด์žฅ ๊ฐ’ ์ €์žฅํ•˜๊ธฐ

 N๋ฒˆ์˜ ์ž…์žฅ ์‹œ๊ฐ๊ณผ ํ‡ด์žฅ ์‹œ๊ฐ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด 2 * N ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์„ ์ผ๋‹ค. 2์ฐจ์› ๋ฐฐ์—ด์— ์ €์žฅํ–ˆ๋Š”๋ฐ, 0์—ด์—๋Š” ์‹œ๊ฐ์„ ์ €์žฅํ•˜๊ณ , 1์—ด์—๋Š” ์ž…์žฅ์ด๋ฉด 1, ํ‡ด์žฅ์ด๋ฉด -1์„ ์ €์žฅํ•˜๋„๋ก ํ–ˆ๋‹ค. 

 

 

  • ์‹œ๊ฐ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ

 ๋ชจ๊ธฐ๊ฐ€ ์žˆ๋Š” ์‹œ๊ฐ๋ณ„ ๋ชจ๊ธฐ์˜ ์ˆ˜๋ฅผ ๋ˆ„์ ํ•ด์„œ ํ•ฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์‹œ๊ฐ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹œ๊ฐ์ด ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์ž…์žฅ ์‹œ๊ฐ์ธ ๊ฒฝ์šฐ๊ฐ€ ํ‡ด์žฅ ์‹œ๊ฐ์ธ ๊ฒฝ์šฐ๋ณด๋‹ค ์•ž์„œ๋„๋ก ํ•œ๋‹ค. ์ž…์žฅ ์‹œ๊ฐ์˜ ๊ฐ’์ด ํ‡ด์žฅ ์‹œ๊ฐ์˜ ๊ฐ’๋ณด๋‹ค ๋จผ์ € ๊ณ„์‚ฐ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

  • ๋ชจ๊ธฐ์˜ ๋ˆ„์ ํ•ฉ ๊ตฌํ•˜๊ธฐ, ์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹ ํ•˜๊ธฐ

 map์ผ๋•Œ๋Š” ์‹œ๊ฐ ํ•˜๋‚˜์— ์žˆ๋Š” ์ด ๋ชจ๊ธฐ์ˆ˜๊ฐ€ ์ €์žฅ๋˜์—ˆ์ง€๋งŒ, ๋ฐฐ์—ด์—๋Š” ๊ฐ™์€ ์‹œ๊ฐ์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์ €์žฅ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ์‹œ๊ฐ์ด ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๊ฐ’์„ ๋”ํ•ด์•ผ ํ•œ๋‹ค. (์ด ๋ถ€๋ถ„๋งŒ ์ฃผ์˜ํ•˜๋ฉด ๋’ค์˜ ๋กœ์ง์€ ๊ฐ™๋‹ค.)

 

 ๊ทธ๋ฆฌ๊ณ  ๋ˆ„์ ํ•ฉ์ด ์ตœ๋Œ“๊ฐ’์ด๋ฉด max๋ฅผ ๊ฐฑ์‹ ํ•ด์ฃผ๊ณ , ์ž…์žฅ ์‹œ๊ฐ๋„ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ๋Œ€ ๊ตฌ๊ฐ„์—์„œ ๊ฐ’์ด ๋ฐ”๋€Œ๋Š” ์ง€์ ์ด๋ฉด ํ‡ด์žฅ ์‹œ๊ฐ์„ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค. 

 

 

 

 

 

์ฝ”๋“œ

package algorithm;

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

public class BOJ_๋‹ˆ๊ฐ€์‹ซ์–ด์‹ซ์–ด2 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			
		int N = Integer.parseInt(br.readLine()); //๋ชจ๊ธฐ ๋งˆ๋ฆฟ์ˆ˜
		
		int[][] arr = new int[2 * N][2];
		
		for(int i = 0; i < N; i ++) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");

			int TE = Integer.parseInt(st.nextToken());
			int TX = Integer.parseInt(st.nextToken());

			arr[2 * i] = new int[] {TE, 1};
			arr[2 * i + 1] = new int[] {TX, -1};
		}
		
		Arrays.sort(arr, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o1[0] - o2[0]);
		
		int sum = 0;
		int max = 0;
		int ans_start = 0, ans_end = 0;
		
		boolean opened = false; //์ตœ๋Œ€ ๊ตฌ๊ฐ„์ด ์—ด๋ ธ๋Š”์ง€
		
		int i = 0;
		while(i < 2 * N) {
			int cur_time = arr[i][0];
			
			while(i < 2 * N && arr[i][0] == cur_time) {
				sum += arr[i][1];
				i++;
			}
			
			if(sum > max) { //์ตœ๋Œ“๊ฐ’์ด ๋‚˜์˜ค๋ฉด ๊ฐฑ์‹ 
				max = sum;
				ans_start = cur_time;
				opened = true;
			} else if(sum < max && opened) { //์ตœ๋Œ€ ๊ตฌ๊ฐ„์—์„œ ๊ฐ’์ด ๋ฐ”๋€Œ๋Š” ์ง€์ ์ด๋ฉด
				ans_end = cur_time;
				opened = false; //๊ตฌ๊ฐ„ ๋‹ซ์Œ
			}
		}
		
		System.out.println(max);
		System.out.println(ans_start + " " + ans_end);
	}

}

 

 

 

 

 

๊ฒฐ๊ณผ

 

[๋ฐฉ๋ฒ•1] HashMap ์‚ฌ์šฉ : 1500ms๋Œ€

[๋ฐฉ๋ฒ•2] 2 * N ํฌ๊ธฐ์˜ ๋ฐฐ์—ด ์‚ฌ์šฉ : 900ms๋Œ€

 

 

 

 

 

๋ฐฐ์šด์ 

  • ๊ตฌ๊ฐ„์˜ ๋ชจ๋“  ์ ๋“ค์„ ์ €์žฅํ•  ํ•„์š” ์—†์ด ์‹œ์ž‘์ ์€ +1, ๋์ ์€ -1์„ ์ €์žฅํ•˜์ž
  • ์ขŒํ‘œ๊ณ„์˜ ๋ฒ”์œ„๊ฐ€ ํด ๋•Œ๋Š” ์ขŒํ‘œ ์••์ถ•์„ ํ•˜์ž
giraffe_