F.R.I.D.A.Y.

지식인 : 과일깍기, 테두리 제거 본문

외부활동/지식in

지식인 : 과일깍기, 테두리 제거

F.R.I.D.A.Y. 2018. 9. 25. 20:47
반응형

지식in : https://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=310693375


 질문이 올라왔길래 이전에 비슷한 걸 만들어 본 경험이 있어서 응용해서 만들어봤다. 질문자가 원하는 코드인지는 미지수.


#include <stdio.h>

#define SIZE_ROW 10
#define SIZE_COL 10

void setMap(int *map[][SIZE_COL], int cx, int cy, int ex, int ey);
void printMap(int *map[][SIZE_COL], int *checkMap[][SIZE_COL]);
void check(int *map[][SIZE_COL], int *checkMap[][SIZE_COL], int x, int y);

int main(void) {

	int map[SIZE_ROW][SIZE_COL] = { 0, };
	int checkMap[SIZE_ROW][SIZE_COL] = { 0, };

	setMap(map, 2, 2, 5, 5);
	setMap(map, 6, 6, 9, 9);


	printMap(map, checkMap);

	for (int y = 0; y < SIZE_ROW; y++) {
		for (int x = 0; x < SIZE_COL; x++) {
			if (map[y][x]) {
				if (!checkMap[y][x]) check(map, checkMap, x, y);
				
				//printf("x : %d\ty : %d\n", x, y);
				//printMap(map, checkMap);
			}
			else checkMap[y][x] = 1;
		}
	}

	printMap(map, checkMap);

	return 0;

}

void printMap(int *map[][SIZE_COL], int *checkMap[][SIZE_COL]) {
	printf("data map: \n");
	for (int y = 0; y < SIZE_ROW; y++) {
		for (int x = 0; x < SIZE_COL; x++) {
			printf("%d ", map[y][x]);
		}
		printf("\n");
	}
	printf("checkMap: \n");
	for (int y = 0; y < SIZE_ROW; y++) {
		for (int x = 0; x < SIZE_COL; x++) {
			printf("%d ", checkMap[y][x]);
		}
		printf("\n");
	}
	printf("\n");
}


void setMap(int *map[][SIZE_COL], int cx, int cy, int ex, int ey) {
	for (int y = cy; y <= ey; y++) {
		for (int x = cx; x <= ex; x++) {
			map[y][x] = 1;
		}
	}
}

void check(int *map[][SIZE_COL], int *checkMap[][SIZE_COL], int x, int y) {
	int cx, cy;
	cx = x, cy = y;

	while (SIZE_ROW > cy && map[cy][x]) {
		checkMap[cy][x] = 1;
		if (map[cy][x]) cy++;
	}
	while (SIZE_COL > cx && map[y][cx]) {
		checkMap[y][cx] = 1;
		if (map[y][cx]) cx++;
	}
	
	for (int k = y; k < cy; k++) {
		for (int i = x; i < cx; i++) {
			checkMap[k][i] = 1;
		}
	}

	for (int i = y; i < cy; i++) {
		map[i][x] = 0;
		map[i][cx - 1] = 0;
	}
	for (int i = x; i < cx; i++) {
		map[y][i] = 0;
		map[cy - 1][i] = 0;
	}
}



 문제의 핵심은 어떻게 사각형 영역을 찾을지와, 이미 찾은 사각형을 어떻게 제외할것인가. 이 두가지로 생각해볼 수 있다. 테두리 제거의 경우 사각형 영역만 찾으면 그 영역을 토대로 삭제할 수 있기 때문에 간단하다.


 이미 찾은 사각형의 경우, 기존 데이터 맵과 동일한 크기의 배열을 생성해 체크한 부분을 1로 만들어버리면 해당 부분이 체크가 된 영역이면 패스하고 그렇지 않으면 체크를 하는 방식으로 진행했다.


728x90
반응형
Comments