문제 

눈금의 간격이 1인 M×N(M,N≤100)크기의 모눈종이가 있다. 이 모눈종이 위에 눈금에 맞추어 K개의 직사각형을 그릴 때, 이들 K개의 직사각형의 내부를 제외한 나머지 부분이 몇 개의 분리된 영역으로 나누어진다.

예를 들어 M=5, N=7 인 모눈종이 위에 <그림 1>과 같이 직사각형 3개를 그렸다면, 그 나머지 영역은 <그림 2>와 같이 3개의 분리된 영역으로 나누어지게 된다.

<그림 2>와 같이 분리된 세 영역의 넓이는 각각 1, 7, 13이 된다.

M, N과 K 그리고 K개의 직사각형의 좌표가 주어질 때, K개의 직사각형 내부를 제외한 나머지 부분이 몇 개의 분리된 영역으로 나누어지는지, 그리고 분리된 각 영역의 넓이가 얼마인지를 구하여 이를 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오른쪽 위 꼭짓점의 x, y좌표값이 빈칸을 사이에 두고 차례로 주어진다. 모눈종이의 왼쪽 아래 꼭짓점의 좌표는 (0,0)이고, 오른쪽 위 꼭짓점의 좌표는(N,M)이다. 입력되는 K개의 직사각형들이 모눈종이 전체를 채우는 경우는 없다.

 

출력 

첫째 줄에 분리되어 나누어지는 영역의 개수를 출력한다. 둘째 줄에는 각 영역의 넓이를 오름차순으로 정렬하여 빈칸을 사이에 두고 출력한다.

 

예제

입력:

5 7 3
0 2 4 4
1 1 2 5
4 0 6 2

출력

3
1 7 13

 

 

코드

var input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n'); 
var total = input.shift().split(' ');
var map = [], answer = [];
var count;

function fillRect (startY, startX, endY, endX) {
    for(let i=startX; i<endX; i++) {
        for(let j=startY; j<endY; j++) {
            map[i][j]++;
        }
    }
}

var getAreaSize = (x, y) => {
    count++;
    map[x][y] = -1;
    if(x-1>=0 && map[x-1][y]===0) getAreaSize(x-1,y);
    if(x+1< total[0]&& map[x+1][y]===0) getAreaSize(x+1,y);
    if(y-1>=0 && map[x][y-1]===0) getAreaSize(x,y-1);
    if(y+1< total[1]&& map[x][y+1]===0) getAreaSize(x,y+1);

    return count;
}

for(let i=0; i<total[0]; i++) {
    map[i] = [];
    for(let j=0; j<total[1]; j++) {
        map[i][j] = 0;
    }
}

for(let i=0; i<total[2]; i++) {
    var temp = input[i].trim().split(' ');
    fillRect(Number(temp[0]), Number(temp[1]), Number(temp[2]), Number(temp[3]));
}

for(let i=0; i<total[0]; i++) {
    while(map[i].indexOf(0) !== -1) {
        count = 0;
        answer.push(getAreaSize(i, map[i].indexOf(0)));
    }
}

answer.sort((a,b) => a-b);
console.log(answer.length + '\n' + answer.join(' '));



설명

문제 해결 아이디어는 금방 알아냈는데...

getAreaSize()에서 조건문에 total[0]과 total[1]을 똑같이 total[0]이라고 해서 계속 틀렸다..

복붙 실수하지 말자!!

 

 

 

문제 

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다.

크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은 색상이라 한다)

예를 들어, 그림이 아래와 같은 경우에

RRRBB
GGBBB
BBBRR
BBRRR
RRRRR

적록색약이 아닌 사람이 봤을 때 구역의 수는 총 4개이다. (빨강 2, 파랑 1, 초록 1) 하지만, 적록색약인 사람은 구역을 3개 볼 수 있다. (빨강-초록 2, 파랑 1)

그림이 입력으로 주어졌을 때, 적록색약인 사람이 봤을 때와 아닌 사람이 봤을 때 구역의 수를 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100)

둘째 줄부터 N개 줄에는 그림이 주어진다.

 

출력 

적록색약이 아닌 사람이 봤을 때의 구역의 개수와 적록색약인 사람이 봤을 때의 구역의 수를 공백으로 구분해 출력한다.

 

예제

입력:

5
RRRBB
GGBBB
BBBRR
BBRRR
RRRRR

출력

4 3

 

 

코드

var input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n'); 
var total = input.shift();
var pic = [], check = [], answer = [];

for(let i=0; i<total; i++) {
    pic[i] = input[i].trim().split('');
}

var getUnsearched = (arr) => {
    for(let i=0; i<total; i++) {
        if(arr[i].indexOf(false) !== -1) {
            return [i, arr[i].indexOf(false)];
        }
    }
    return false;
}

var reset = (arr) => {
    for(let i=0; i<total; i++) {
        arr[i] = [];
        for(let j=0; j<total; j++) {
            arr[i][j] = false;
        }
    }
    return arr;
}

var search = (x, y, color) => {
    check[x][y] = true;
    
    if(x-1>=0 && pic[x-1][y]===color && !check[x-1][y]) search(x-1, y, color);
    if(x+1<total && pic[x+1][y]===color && !check[x+1][y]) search(x+1, y, color);
    if(y-1>=0 && pic[x][y-1]===color && !check[x][y-1]) search(x, y-1, color);
    if(y+1<total && pic[x][y+1]===color && !check[x][y+1]) search(x, y+1, color);
}

var replaceG_to_R = () => {
    for(let i=0; i<total; i++) {
        pic[i] = input[i].trim().replace(/G/gi, 'R').split('');
    }
    return pic;
}

var divideColor = () => {
    check = reset(check);
    var temp = getUnsearched(check);
    var count = 0;
    
    while(temp !== false) {
        search(temp[0], temp[1], pic[temp[0]][temp[1]]);
        count++;
        temp = getUnsearched(check);
    }
    return count;
}

answer.push(divideColor());
pic = replaceG_to_R();
answer.push(divideColor());

console.log(answer.join(' '));



설명

코드에서 마지막 부분을 보면 answer.push(divideColor());가 두 번 등장하는데, divideColor()는 주어진 그림이 몇 구역으로 나누어져 있는지 카운팅한다.

첫번째로 등장하는 answer.push(divideColor());는 기존 R, G, B를 구분하여 카운팅하는 것이고, 

두번째에서는 pic = replaceG_toR();을 먼저 실행시켜 모든 G를 R로 바꾼 뒤 카운팅한다. (적록색약)

이 때, 각 그림영역을 탐색했는지 확인하는 check 배열을 하나만 사용하기 때문에 초기화해주는 것이 중요하다.

 

 

 

 

 

1. 데이터베이스 관리 시스템의 등장 배경

 

 

 

파일 시스템, File system

     데이터를 파일로 관리하기 위해 파일을 생성/삭제/수정/검색 하는 기능을 제공하는 소프트웨어

     응용 프로그램마다 필요한 데이터를 별도의 파일로 관리

 

파일 시스템에서의 데이터 관리

 

 

파일 시스템의 문제점

     같은 내용의 데이터가 여러 파일에 중복 저장

       →   저장 공간의 낭비 & 데이터 일관성과 데이터 무결성을 유지하기 어려움

 

     응용 프로그램이 데이터 파일에 종속적

       →   사용하는 파일의 구조를 변경하면 응용 프로그램도 함께 변경해야 함

 

     데이터 파일에 대한 동시 공유, 보안, 회복 기능이 부족

     응용 프로그램 개발이 쉽지 않음

 

 

 

 

2. 데이터베이스 관리 시스템의 정의

데이터베이스 관리 시스템, DBMS (DataBase Management System)

     파일 시스템의 문제를 해결하기 위해 제시된 소프트웨어

     조직에 필요한 데이터를 데이터베이스에 통합하여 저장하고 관리

 

데이터베이스 관리 시스템에서의 데이터 관리

 

 

 

데이터베이스 관리 시스템의 주요 기능

정의 기능

: 데이터베이스의 구조를 정의하거나 수정

 

조작 기능

: 데이터를 삽입/삭제/수정/검색

 

제어 기능

: 데이터를 항상 정확하고 안전하게 유지

 

 

 

 

3. 데이터베이스 관리 시스템의 장단점

장점

     데이터 중복을 통제

     데이터 독립성 확보

     데이터를 동시 공유

     데이터 보안 향상

     데이터 무결성 유지

     장애 발생 시 회복 가능

     응용 프로그램 개발 비용 감소

 

 

단점

     비용이 많이 듦

     백업과 회복 방법이 복잡

     중앙 집중 관리로 인한 취약점 존재

 

 

 

 

4. 데이터베이스 관리 시스템의 발전 과정

1세대 : 네트워크 DBMS, 계층 DBMS

네트워크 DBMS

: 데이터베이스를 그래프 형태로 구성

    예) IDS, Integrated Data Store

 

계층 DBMS

: 데이터베이스를 트리 형태로 구성

    예) IMS, Information Management System

 

 

2세대 : 관계 DBMS

관계 DBMS

: 데이터베이스를 테이블 형태로 구성, 단순하고 이해하기 쉬운 구조

    예) 오라클(Oracle), MS SQL 서버, 액세스(Access), 인포믹스(Informix), MySQL, MariaDB

 

 

3세대 : 객체지향 DBMS, 객체관계 DBMS

객체지향 DBMS

: 객체를 이용해 데이터베이스를 구성, 더 다양하고 복잡한 응용 분야의 데이터를 관리

    예) 오투(O2), 온투스(ONTOS), 젬스톤(GemStone)

 

객체관계 DBMS

: 객체 DBMS + 관계 DBMS

 

 

4세대 이후 : NoSQL DBMS, NewSQL DBMS

NoSQL(Not Only SQL) DBMS

: 비정형 데이터를 저장하고 처리하는 데 적합, 안정성과 일관성 유지를 위한 복잡한 기능 포기

    예) 몽고디비(MongoDB), H베이스(HBase), 카산드라(Cassandra), 레디스(Redis)

 

NewSQL DBMS

: 정형 및 비정형 데이터를 안정적이고 빠르게 처리

    예) 구글 스패너(Spanner), 볼트DB(VoltDB), 누오DB(NuoDB)

 

 

 

 

'CS > Database' 카테고리의 다른 글

[데이터베이스 개론] 데이터베이스 기본 개념  (0) 2022.05.21

+ Recent posts