https://www.acmicpc.net/problem/10431
학생 20명이 한 명씩 줄의 맨 뒤에 서되, 자기 앞에 자신보다 큰 학생이 있으면 그중 가장 앞 학생 A의 바로 앞에 끼어든다. A부터 뒤 학생들은 한 칸씩 뒤로 물러남
모든 학생이 다 선 뒤, 뒤로 물러난 총 걸음 수를 구한다.
입력
출력
자기 앞에 자신보다 큰 학생이 있으면 한 칸씩 뒤로 물러날 때
Case 1) 이미 모든 학생 오름차순인 경우
Case 2) 만약 오름차순이 아닌 경우
위 예시들에서 일반화를 하자면 현재 순서가 i번째 일 때 i의 전에 있던 사람들 중 i보다 키 큰 사람의 수만큼 이동한다.
예를 들어 두 번째 예시에서 현재 904라면 1번, 현재 903일 때 2번, 현재 902일 때 3번, 901일 때 4번 = 10번이다.
첫 번째 예시에서는 903일 때 0번, 901일 때 1번, 902일 때 1번 = 2번이다.
20번 밖에 안되므로 for문을 20번 돌고 그 안에 이중 포문으로 현재 i일때 i 이전 순서들을 체크하면서 역순서인 경우를 카운트하면 된다.
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int p;
cin >> p;
while (p--) {
int t;
int cnt = 0;
cin >> t;
int students[20];
for (int i=0; i<20; i++) {
cin >> students[i];
}
for (int i=0; i < 20; i++) {
for (int j=0; j<i; j++) {
if (students[i] < students[j]) {
cnt++;
}
}
}
cout << t << ' ' << cnt << '\n';
}
}