시나브로

8568. 3으로 나눈 순열 본문

알고리즘/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;
}

 

 

 

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AW1B8rJq3NUDFARC&categoryId=AW1B8rJq3NUDFARC&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

728x90

'알고리즘 > SW Expert Academy' 카테고리의 다른 글

[D3] 9317. 석찬이의 받아쓰기  (0) 2020.03.08
8567. 약수의 개수가 많은 수  (0) 2020.01.07
9088. 다이아몬드  (0) 2020.01.06
8993. 하지 추측  (0) 2020.01.06
[D4] 7465. 창용 마을 무리의 개수  (0) 2019.10.12
Comments