알고리즘/SW Expert Academy
8568. 3으로 나눈 순열
혬혬
2020. 1. 7. 20:20
728x90
아무리해도 논리가 맞아서 왜 안되지하다가 i가 j로 잘못적힌거 발견했다....
다음부터는 이런 실수하지 않길...
먼저 순열을 받으면서 각 숫자에 대한 %3의 값을 저장하고
0번부터 자리값과 숫자값이 맞는 지 확인한다.
틀리다면, 그 이후로 swap해서 2개의 숫자가 제자리에 갈수 있도록하는 자리를 찾고, 없을 때를 대비하여 제자리에 있지 않고 현재자리의 값을 가지고 있는 숫자를 저장하여 swap한다.
#include<stdio.h>
void swap(int list1[], int list2[]) {
int temp[2] = { list1[0],list1[1] };
list1[0] = list2[0];
list1[1] = list2[1];
list2[0] = temp[0];
list2[1] = temp[1];
}
int main(void) {
freopen("inp.inp", "r", stdin);
freopen("out.out", "w", stdout);
int ts = 0;
scanf("%d", &ts);
for (int q = 0; q < ts; q++) {
int amount = 0;
scanf("%d", &amount);
int count = 0;
int list[1000][2] = { 0 };
for (int p = 0; p < amount; p++) {
scanf("%d", &list[p][0]);
list[p][1] = list[p][0] % 3;
}
int point = 0;
for (int i = 0; i < amount; i++) {
++point %= 3;
if (point == list[i][1])
continue;
int sig = 0;
int before = 0;
for (int j = i+1; j < amount; j++) {
if (list[j][1] == point&&list[i][1] == (j+1) % 3) {
count++;
swap(list[i], list[j]);
sig = 1;
break;
}
if (list[j][1] == point&&list[j][1] != (j + 1) % 3)
before = j;
}
if (sig != 1) {
count++;
swap(list[i], list[before]);
}
}
printf("#%d %d\n", q + 1, count);
}
return 0;
}
728x90