1- // Authored by : jimi567
1+ // Authored by : keyboardmunji
22// 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>
65#define X first
76#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+
1313int 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--;
3241 }
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