별집사의 IT세상

문제은행 1037 오류교정 본문

IT/정올

문제은행 1037 오류교정

별집사 2017. 4. 8. 12:35
반응형

행, 열 중 하나를 기준으로 더해본 후 세가지 경우로 나누어서 생각한다. (여기서는 행을 기준으로 생각)

1. 각 행의 합이 모두 짝수이다

2. 각 행의 합이 하나만 홀수이다

3. 각 행의 합이 두개 이상 홀수이다



이 상황에서 앞의 기준의 반대(행이 기준이였으면 열)를 위와 마찬가지로 세가지로 나눌 수 있다. (여기서는 열을 기준으로 생각)

1. 각 행의 합이 모두 짝수이고 각 열의 합도 모두 짝수이다 -> OK

2. 각 행의 합이 하나만 홀수이고, 각 열의 합도 하나만 홀수이다 -> Change bit

3. 각 행의 합이 두개 이상 홀수이거나, 각 열의 합이 두개 이상 홀수이다. -> Corrupt









#include 


int main() {
	int a[101][101];
	int N;
	int i, j;
	int x, y;
	int sumx;
	int sumy;
	int index = 0; // 0이면 OK 1이면 Change bit(i,j) 2이면 Corrupt
	int check = 0;
	scanf("%d", &N);
	//행 부분 계산
	for (i = 1; i <= N; i++) {
		sumx = 0;
		for (j = 1; j <= N; j++) {
			scanf("%d", &a[i][j]);
			sumx = (sumx + a[i][j]) % 2;
		}

		if (sumx && !check) {
			check++;
			x = i;
			index = 1;
		}
		else if (sumx && check) {
			index = 2;
			break;
		}
	}

	//열 부분 계산(위에서 이미 틀린경우에는 계산할 필요가 없으므로 if문으로 통과)
	if (index == 2) {
	}
	else {
		check = 0;
		for (i = 1; i <= N; i++) {
			sumy = 0;
			for (j = 1; j <= N; j++) {
				sumy = (sumy + a[j][i]) % 2;
			}

			if (sumy && !check) {
				check++;
				y = i;
				index = 1;
			}
			else if (sumy && check) {
				index = 2;
				break;
			}
		}

	}

	//결과
	if (index == 0) {
		printf("OK");
	}
	else if (index == 1) {
		printf("Change bit (%d,%d)", x, y);
	}
	else
		printf("Corrupt");

	return 0;
}


간단하게 할 수 있을 것도 같은데 졸려서 나중에 기회가 된다면 생각을...


반응형

'IT > 정올' 카테고리의 다른 글

알고리즘 1108 페이지전환  (0) 2017.04.15
알고리즘 2613 토마토  (0) 2017.04.14
문제은행 1045 암스트롱 수  (0) 2017.04.08
Comments