코딩공작소

[시뮬레이션]최근접쌍 본문

알고리즘/시뮬레이션

[시뮬레이션]최근접쌍

안잡아모찌 2018. 9. 30. 18:40

<문제>



첫번째 아이디어 : O(n^2) 모든 점에 대해서 모두 거리를 구해서 최소 값을 찾는다. 최소값이 여러번 나올 경우 카운트 업. -->시간초과

두번째 아이디어 : 점들을 x좌표로 정렬해준후 , 자신과 가장 근접해있는 다른집합의 점과 만나면 멈춰서 길이를 구해서 비교 -->시간초과

세번째 아이디어 : 생각해보니 왼쪽은 이미 최소가 구해져있어서 오른쪽으로만 최소값들을 계산해주면 되었다. -->시간초과

네번째 아이디어 : 같은 집합이 연달아 붙어있으면 작은 x좌표 집합은 버리고 큰쪽에서 시작해준다. -->시간초과


결과 : 시간초과로 인한 실패

느낀점 : 알고리즘을 구현할 때, 무턱대고 작성하는것은 매우 비효율적이다. 스스로 시뮬레이션을 많이 돌려보면서 최적의 방법를 찾아서

구현하는것이 중요하다. 이때, 시간복잡도가 낮은 방법부터 서서히 최대한 생각해보면서 하는것이 시간적으로도 효율적이다.


**클래스객체의 배열을 위해서 우선순위를 바꿔주는 방법**

항상 할때마다 잊어버리기 때문에 정리해야겠다.

1.해당 클래스에 Comparable<?>을 implements 해준다. ( ? implements Comparable<?> )

2.int compareTo(? x)함수를 만들어서 우선순위를 정해준다. (오버라이딩)

비교하고자 하는 int의 값을 비교해서 오름차순,내림차순을 결정해준다. 

오름차순 : this 가 큰 경우 1을 리턴, this 가 작은 경우 -1을 리턴해준다.

내림차순 : 반대로 해준다. 




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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import java.util.*;
 
 
 
public class Main { 
 
   static int Y ;
 
 
 
   static class Point implements Comparable<Point>{
 
       int F; 
 
       int x; 
 
       
 
       Point(){}
 
       
 
       Point(int F,int x){
 
           this.F = F;
 
           this.x = x;
 
       }
 
       
 
       public int compareTo(Point p) { 
 
           if(this.x>p.x) return 1;
 
           else if(this.x<p.x) return -1;
 
           else return 0;
 
       }
 
   }
 
   
 
   public static void main(String[] args) {
 
      Scanner scan = new Scanner(System.in);
 
      
 
      int n = scan.nextInt();//ip P number
 
      int m = scan.nextInt();//up Q number
 
      
 
      int py = scan.nextInt();
 
      int qy = scan.nextInt();
 
      Y = py>qy ? py-qy : qy-py;
 
      
 
      Point []XY = new Point[n+m];
 
      for(int i=0;i<n;i++) {
 
          int x = scan.nextInt();
 
          XY[i]=new Point(1,x);
 
      }
 
      
 
      for(int i=n;i<n+m;i++) {
 
          int x = scan.nextInt();
 
          XY[i]=new Point(2,x);
 
      }
 
      
 
      Arrays.sort(XY);
 
      
 
      int count = 0;
 
      int min = Integer.MAX_VALUE;
 
      
 
      int start = 0;
 
      while(true) {
 
          if(XY[start].F==XY[start+1].F) start+=1;
 
          else {
 
              int dis = XY[start+1].x-XY[start].x;
 
              if(min > dis) {
 
                  min = dis;
 
                  count=1;
 
              }else if(min == dis) count++;
 
              start+=1;
 
          }
 
          
 
          if(start==m+n-1break;
 
      }
 
      
 
      System.out.print(min+Y+" "+count);
 
   }     
 
}
cs

'알고리즘 > 시뮬레이션' 카테고리의 다른 글

[백준]나무재테크  (0) 2019.07.08
[백준]로봇청소기(2,3번째 풂)  (0) 2019.07.05
[백준]뱀  (0) 2019.07.04
[백준]경사로_삼성기출  (0) 2019.07.02
[시뮬레이션]주사위던지기  (0) 2019.04.04