1
- // Authored by : jimi567
1
+ // Authored by : keyboardmunji
2
2
// Co-authored by : -
3
- // http://boj.kr/7d30341579424e59a3868fc91e1980d6
4
- #include < bits/stdc++.h>
5
- using namespace std ;
3
+ // http://boj.kr/e0c5f4a5d5fc4c8bae9107590e538eae
4
+ #include < bits/stdc++.h>
6
5
#define X first
7
6
#define Y second
8
- #define ll long long
9
- int n, m;
10
- int arr[1005 ][1005 ];
11
- int ans = 0x7f7f7f7f ;
12
- vector<int > idx; // 각 팀들의 현재 인덱스를 저장하는 벡터.
7
+
8
+ using namespace std ;
9
+ int n, m, cnt, en, ans = 0x7f7f7f7f ;
10
+ int chk[1005 ]; // 각 팀이 구간속에 모두 있는지 확인하는 벡터
11
+ vector<pair<int , int >> a; // 능력치와 각팀의 인덱스를 저장하는 벡터
12
+
13
13
int main (void ) {
14
- ios::sync_with_stdio (0 );
15
- cin.tie (0 );
16
- cin >> n >> m;
17
- for (int i = 0 ; i < n; i++) {
18
- idx.push_back (0 );
19
- for (int j = 0 ; j < m; j++) cin >> arr[i][j];
20
- }
21
- for (int i = 0 ; i < n; i++) sort (arr[i], arr[i] + m);
22
- while (1 ) {
23
- int mntm;
24
- int mx = -1 ;
25
- int mn = 0x7f7f7f7f ;
26
- for (int i = 0 ; i < n; i++) {
27
- if (mn > arr[i][idx[i]]) { // 최솟값 갱신, 최솟값을 가지는 팀 갱신
28
- mn = arr[i][idx[i]];
29
- mntm = i;
30
- }
31
- if (mx < arr[i][idx[i]]) mx = arr[i][idx[i]]; // 최댓값 갱신
14
+ ios::sync_with_stdio (false );
15
+ cin.tie (NULL );
16
+
17
+ cin >> n >> m;
18
+ for (int i = 0 ;i < n;i++) {
19
+ for (int j = 0 ;j < m;j++) {
20
+ int num;
21
+ cin >> num;
22
+ a.push_back ({ num, i });
23
+ }
24
+ }
25
+ sort (a.begin (), a.end ());
26
+
27
+ for (int st = 0 ;st < n * m;st++) {
28
+ // 구간 속에 각 팀이 모두 포함되게 en을 증가
29
+ while (cnt < n && en < n * m) {
30
+ if (chk[a[en].Y ] == 0 )
31
+ cnt++;
32
+ chk[a[en].Y ]++;
33
+ en++;
34
+ }
35
+ if (cnt != n)
36
+ break ;
37
+ ans = min (ans, a[en - 1 ].X - a[st].X );
38
+ chk[a[st].Y ]--;
39
+ if (chk[a[st].Y ] == 0 )
40
+ cnt--;
32
41
}
33
- ans = min (ans, mx - mn);
34
- idx[mntm] += 1 ;
35
- if (idx[mntm] == m)
36
- break ; // 만약 최솟값을 가지는 팀이 마지막 인덱스에 해당하면 종료.
37
- }
38
- cout << ans;
39
- }
42
+ cout << ans;
43
+ return 0 ;
44
+ }
0 commit comments