일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 알고리즘
- Javascript
- Win32
- Tips강좌
- 배열
- 티스토리
- Programming
- 이지스퍼블리싱
- Direct2D
- tipssoft
- c
- CS
- 지식나눔강좌
- Kotlin
- Visual Studio
- 포인터
- 함수
- 리뷰
- Windows
- 백준
- 연산자
- 프로그래밍
- 문법
- c++
- VS ERROR
- Desktop
- c#
- 김성엽
- Tips프로그래밍강좌
- doit코틀린프로그래밍
Archives
- Yesterday
- Today
- Total
F.R.I.D.A.Y.
지식인 : 과일깍기, 테두리 제거 본문
반응형
지식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
반응형
'외부활동 > 지식in' 카테고리의 다른 글
지식인 : 리스트 자료구조 포인터 (0) | 2019.03.06 |
---|---|
지식인 : 성적을 xls(엑셀)로 출력하기 (0) | 2019.01.16 |
지식인 : 시간 문자열을 숫자(초)로 변환하기 (0) | 2018.11.13 |
지식인 : 두번 째로 큰 수, 두번 째로 작은 수 (0) | 2018.11.12 |
지식인 : if없이 가까운 수 찾기 (0) | 2018.09.25 |
Comments