https://www.acmicpc.net/problem/20440
๋ฌธ์
- ๋ชจ๊ธฐ๋ค์ ๋ฐฉ ์ ์ฅ, ํด์ฅ ์๊ฐ์ด ์ฃผ์ด์ก์ ๋ ๋ชจ๊ธฐ๋ค์ด ๊ฐ์ฅ ๋ง์ด ์๋ ์๊ฐ๋์ ํด๋น ์๊ฐ๋์ ๋ชจ๊ธฐ๊ฐ ๋ช ๋ง๋ฆฌ๊ฐ ์๋์ง ๊ตฌํ๊ธฐ
์ ํ ์ฌํญ
- ๋ชจ๊ธฐ์ ๋ง๋ฆฟ์ 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์ ์ ์ฅํ์
- ์ขํ๊ณ์ ๋ฒ์๊ฐ ํด ๋๋ ์ขํ ์์ถ์ ํ์
'Algorithm > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 1937๋ฒ : ์์ฌ์์ด ํ๋ค (0) | 2024.01.26 |
---|---|
๋ฐฑ์ค 15486๋ฒ : ํด์ฌ2 (0) | 2024.01.14 |
๋ฐฑ์ค 1749๋ฒ : ์ ์๋ฐ๋จน๊ธฐ (0) | 2024.01.12 |
๋ฐฑ์ค 14846๋ฒ : ์ง์ฌ๊ฐํ๊ณผ ์ฟผ๋ฆฌ (0) | 2024.01.12 |
๋ฐฑ์ค 11660๋ฒ : ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ5 (0) | 2024.01.12 |