BOJ 27067 - 데이터 순서 복원

image.png

어딘가에서 본듯한 문제인데, 특별한 comparision을 가지고 정렬을 하는 문제이다.

어떤 $i,j$ 가 존재하는데 $a$에선 $i$가 $j$보다 먼저 나왔고 $b$에선 $i$가 $j$보다 먼저나왔고 $c$에선 $i$가 $j$보다 늦게나왔다고 하자.

이 경우 원래 배열에서도 항상 $i$가 $j$보다 먼저 나와야 함을 가지고 정렬한다.

왜냐면 $i - j$ 순으로 되어있는데 $j$가 $i$ 앞으로 갈 수 있는 횟수는 최대 $1$번이기 때문이다.

void solve() {  
   int n;  
   cin >> n;  
   vi a(n), b(n), c(n);  
   fv(a)  
   fv(b)  
   fv(c);  
   vi ans;  
   for (int i = 1; i <= n; i++) ans.pb(i);  
   auto idx_of = [&](vi &a, int x) {  
      for (int i = 0; i < n; i++) if (a[i] == x) return i;  
   };  
   auto cmp = [&](int i, int j) {  
      int amin = 0;  
      amin += idx_of(a, i) < idx_of(a, j) ? 1 : 0;  
      amin += idx_of(b, i) < idx_of(b, j) ? 1 : 0;  
      amin += idx_of(c, i) < idx_of(c, j) ? 1 : 0;  
      return amin >= 2;  
   };  
   sort(all(ans), cmp);  
   for (int i: ans) cout << i << ' ';  
}

Tags:

Categories:

Updated:

Comments