[알고리즘 기본 개념]
위 문제로 예를 들어보자면 x, y의 좌표는 최대 0,0~2^31, 2^31이다.
2^31은 int의 바운더리 안에 가깝게 들어오는 값이다. (int는 최대 2^32 = 20억정도)
만약, (0,0) 과 (2^31, 2^31) 을 비교하라고 하면 n의 범위를 2^31 로 둘 수 있을까? 시간 초과 결과가 나올 것이다.
컴퓨터가 1초에 처리할 수 있는 연산은 1억 정도.
그래서 인덱스를 이용한 좌표 압축 알고리즘이 있다.
data = [[0, 0], [1, 1], [0, 2], [2, 0], [0, 3], [3, 2], [1, 4], [4, 4], [100, 50], [150, 30]]
이렇게 비교가 필요한 좌표가 주어진다면
x의 좌표와 y좌표를 따로 구분한다.
xpoint = [0,1,0,2,0,3,1,4,100,150]
ypoint = [0,1,2,0,3,2,4,4,50,30]
그리고 중복을 제거한다. (중복이 있을 필요가 없다.)
xpoint = [0,1,2,3,4,100,150]
ypoint = [0,1,2,3,4,50,30]
중복을 제거한 각 벡터를 오름차순으로 정렬한다.
xpoint = [0,1,2,3,4,100,150]
ypoint = [0,1,2,3,4,30,50]
이제 각 좌표를 탐색하면서 인덱스로 대치해준다.
data[0][0] == x[0] (0)
data[0][0] = 0;
data[0][1] == y[0] (0)
data[0][1] = 0
data[1][0] == x[1] (1)
data[1][0] = 1;
....
data[9][0] == x[6]
data[9][0] = 6;
data[9][1] == y[5]
data[9][1] = 5;
이렇게 하면
0,0 | 0 0 |
1,1 | 1 1 |
0,2 | 0 2 |
2,0 | 2 0 |
0,3 | 0 3 |
3,2 | 3 2 |
1,4 | 1 4 |
4,4 | 4 4 |
100,50 | 5 6 |
150,30 | 6 5 |
이렇게 좌표가 압축된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
for (int i =0; i < data.size(); i++) {
xp.push_back(data[i][0]);
yp.push_back(data[i][1]);
}
unordered_set<int> uniqXp(xp.begin(), xp.end()); //중복 제거
unordered_set<int> uniqYp(yp.begin(), yp.end()); //중복 제거
xp.clear(); yp.clear(); //중복 제거된 값을 넣기 위해 clear
sort(xp.begin(), xp.end());
sort(yp.begin(), yp.end());
//좌표 압축
int x = 0, y = 0;
for (int i = 0; i < data.size(); i++) {
for (int j = 0; j < xp.size(); j++) {
if (data[i][0] == xp[j]) {
x = j;
data[i][0] = x; //좌표를 인덱스로 대체한다.
break;
}
}
for (int j = 0; j < yp.size(); j++) {
if (data[i][1] == yp[j]) {
y = j;
data[i][1] = y; //좌표를 인덱스로 대체한다.
break;
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
'Computer Science' 카테고리의 다른 글
[SQL] 우유와 요거트가 담긴 장바구니 (0) | 2020.01.14 |
---|---|
next_permutation으로 5C3 구현하기 (0) | 2019.10.17 |
올림, 내림, 반올림 함수 (0) | 2019.08.29 |
c++ 문자열 변환 (0) | 2019.08.28 |
Binary Tree (0) | 2019.08.09 |