2022.8.21.일요일 공부 기록: 관계형데이터베이스 이론, 프로그래머스 크레인 인형뽑기, 생활코딩, 운영체제 챕터 2

Dorito·2022년 8월 21일
0

공부 기록

목록 보기
7/71

개요

오전 공부

  • 원리부터 배우는 관계형 데이터 베이스 실전 입문

근데 이거 책 개요에 초심자 대상이 아니라 DB응용 프로그램 개발한 경험이 있는 경험자를 대상으로 하고 있다는데 속독하고 나중에 다시 읽어야 할 듯함

오후 공부

저녁 공부

  • 운영체제 복습 및 정리

관계형 데이터 베이스 실전 입문

개인 학습용으로 정리한 내용입니다.

어차피 이해 다 못할거라서..
챕터 1, 2장 읽을거임~

3.5까지 읽었다.
대충 요약..인데 키워드만 살짝 적어둠

SQL이란 관계형데이터베이스(이하 RDB)에 질의를 하기 위한 언어이다.

SQL은 관계형 모델을 기반으로 한 질의 언어지만 관계형 모델을 충실하게 재현하지는 않는다.
관계형 모델이 나타내는 데이터 모델은 설계의 의미가 아니라 데이터를 어떻게 표현할까의 개념이다.
~라는 개념을 써서 데이터를 보여주세요 라고 정하는 것이 데이터 모델이고, 관계형 모델은 그중 하나라고 한다.

관계형 모델을 이해할 때 가장 중요한 것이 관계(릴레이션)이다.

릴레이션이 테이블 사이의 관계라고 이해하는 것은 잘못된 오해다!
SQL에 있어 릴레이션에 해당하는 것은 테이블이다!

SQL과 관계형모델은 다른 것이고 집합론적 관점에서 바라봐야 SQL을 정확히 관계형모델로서 사용할 수 있다.

  • 집합의 요소 조건
  1. 어떤 요소가 집합에 포함돼 있는지 불확정한 요소 없이 판정할 수 있어야 한다.
    = 무엇인지 모르는 미지의 요소는 집합에 포함될 수 없다.
    1. 숫자로 이뤄진 집합 N이 있다면 1이라는 숫자가 N에 포함되어 있는지 확실하게 판단할 수 있어야 한다.
  2. 집합의 요소가 중복돼서는 안된다.
    1. 집합에서 중요한 것은 어떤 요소가 포함돼 있냐 아니냐는 점
    2. 집합론에서는 같은 요소가 몇개 있는지가 의미를 가져서도 안되고 연산 결과에 영향을 줘서 안됨
  3. 집합의 요소는 더는 분해될 수 없다.
  • 대표적인 릴레이션 연산 종류
  1. 제한(Restrict): 특정 조건에 맞는 튜플을 포함한 릴레이션을 반환 (결과: 릴레이션의 부분 집합, 공집합 포함)
  2. 프로젝션(Projection): 어떤 릴레이션에서 특정 속성만 포함하는 릴레이션을 반환. 속성이 적어지면 튜플 중복 발생할 수 있다. 집합은 중복되는 요소를 포함할 수 없으므로 중복이 발생한 경우 같은 튜플로 간주한다.
  3. 확장(Extend): 대부분 기존 속성값을 이용해서 새로운 속성값 만들어냄
  4. 속성명 변경(Rename): 보통 확장한 속성에 대해 명칭 부여할 때 많이 사용
  5. 합집합(Union)
  6. 교집합(Intersect)
  7. 차집합(Difference)
  8. 곱집합(Product)
  9. 결합(Join): 공통된 속성을 가진 두 개 의 릴레이션에서 공통된 속성값이 같은 튜플끼리 조합한 릴레이션을 반환한다.
    1. outer join은 결과에 NULL이 포함될 가능성이 있으므로 릴레이션 연산으로 부적절하다.
    2. inner join을 주로 쓴다
SELECT 칼럼의 목록
FROM 테이블의 목록
WHERE 검색 조건

SQL에서 쓰는 SELECT문도 3개의 릴레이션 연산을 동시에 수행하는 작업이다.
1. 테이블 목록 (곱집합)
2. 검색조건 (제한)
3. 칼럼의 목록 (프로젝션)

관계형 모델에서 릴레이션을 저장하는 변수는 Relvar(관계 변수)라고 한다.

https://www.oreilly.com/library/view/sql-and-relational/9781449319724/ch01s08.html

  • 쿼리 작성할 때 목표는 어떤 집합에서 새로운 집합을 도출하기 위한 법칙을 기술하는 것이다. 이것이 술어다
  • 어떤 데이터가 필요한가? 라는 것을 출발점으로 논리적인 결과로부터 쿼리를 작성할 수 있는 것이 관계형 모델의 최대 강점이다.
  • 술어논리와 집합론은 1대1로 대응하므로 술어를 제대로 작성하면 원하는 집합을 얻을 수 있을 것이다.
  • 술어를 조합해 좀 더 복잡한 술어를 표현하는 것. 그것이 관계형 모델에서의 쿼리의 실체다!

대충 말고 집합론 관련해서 내용도 나와있었는데, 책에서 보면 됨 그리고 집합론 부분은 완벽히 이해하고 넘어가지 않았음.

프로그래머스 크레인 인형뽑기 게임 javascript 풀이

https://school.programmers.co.kr/learn/courses/30/lessons/64061


const solution = (board, moves) => {
  const boardWidth = board[0].length;

  let boardStacks = [];
  for (let i = 0; i < boardWidth; i++) {
    const boardStack = board.map((row) => {
      return row[i];
    });
    boardStacks.push(boardStack);
  } 

  const arrangement = boardStacks.map((a) =>
    a.reverse().filter((elem) => elem > 0)
  );
  //[ [ 3, 4 ], [ 5, 2, 2 ], [ 1, 4, 5, 1 ], [ 3, 4 ], [ 1, 2, 1, 3 ] ]


  let stack = [];
  let total = 0;
  moves.forEach((action) => {
    const selectedItem = arrangement[action - 1].pop();
    if (stack[stack.length - 1] === selectedItem && selectedItem) {
      stack.pop();
      total++;
    } else if (selectedItem) {
      stack.push(selectedItem);
      total++;
    }
  });

  return total - stack.length;
};

console.log(
  solution(
    [
      [0, 0, 0, 0, 0],
      [0, 0, 1, 0, 3],
      [0, 2, 5, 0, 1],
      [4, 2, 4, 4, 2],
      [3, 5, 1, 3, 1],
    ],
    [1, 5, 3, 5, 1, 2, 1, 4]
  )
);

stack 자료 구조 이용함
그래도 이제 생각한 대로 구현할 수 있다는 감각이 대박 좋다!
코드 퀄리티는 별로다. let이 너무 많아..!! 어떻게 고쳐야할지 모르겠다.

프로그래머스 같은 숫자는 싫어

https://school.programmers.co.kr/learn/courses/30/lessons/12906

const solution = (arr) => {
    return arr.filter((num, numIndex) => {
        return num !== arr[numIndex + 1];
    }) 
}
const solution = (arr) => {
  return arr.reduce((acc, cur) => {
    const length = acc.length;
    if (acc[length - 1] === cur) {
      acc.pop();
    }
    // return [...acc, cur]; // 배열을 새로 만든다. 시간 초과 acc + cur -> O(n^2);
    acc.push(cur);
    return acc;
  }, []);
};

뻘짓 목록
1. return [...acc, cur];
배열을 새로 만들고 할당하는 거라 시간 복잡도 n만큼 나올 것이다.
따라서 reduce 시간 복잡도 O(n)안에 spread 연산자를 쓰므로 시간 복잡도 O(n^2)가 나옴
배열 arr의 크기 : 1,000,000 이하의 자연수이므로 10^12만큼 나온다.

  1. return acc.push(cur); 라고 함...
  2. 함수지향으로 풀때 객체를 막 바꾸는게 좋지는 않은 버릇이라고 함 (이해 못 함)

운영체제 챕터 2 공부

[연습문제]

  1. CPU의 구성에 대해 설명하시오.

    산술논리 연산장치, 제어장치, 레지스터
    p.85

  1. 폰노이만 구조의 가장 중요한 특징을 설명하시오.

    모든 프로그램은 메모리에 올라와야 실행할 수 있다.
    p.80

  1. 버스의 종류를 나열하시오.

    cpu 내부버스, 시스템 버스 p.84
    제어버스, 주소버스, 데이터 버스 p.92

  1. 단방향 버스에 대해 설명하시오.

    주소버스 p.91

cpu에서 메모리나 주변 장치로 나가는 주소 정보는 있지만 주소 버스를 통해 cpu로 전달되는 정보는 없다.

  1. 다음에 실행할 명령어의 주소를 가지고 있는 레지스터는 무엇인가?

    PC, 프로그램 카운터 p. 88

  1. 다음에 실행할 명령어를 보관하는 레지스터는 무엇인가?

    명령어 레지스터 (IR) p.88
    6번 오류... 현재 실행할 명령어를 보관하는 레지스터! 라고 해야 함

  1. 메모리 주소를 보관하는 레지스터는 무엇인가?

    주소 레지스터(AR) p.88

  1. 메모리에 저장할 데이터나 메모리에서 가져온 데이터를 임시로 보관하는 레지스터는 무엇인가?

    데이터 레지스터(DR) p.88

  1. 주소 버스와 연결되어 있는 레지스터는 무엇인가?

    메모리 주소 레지스터(MAR) p.88

  1. 데이터 버스와 연결되어 있는 레지스터는 무엇인가?

    메모리 버퍼 레지스터(MBR) p.92

  1. 프로그램을 보호하기 위해 사용하는 두 가지 레지스터는 무엇인가?

    경계 레지스터, 한계 레지스터 p.96

  1. 속도 차이가 나는 두 장치 사이에서 속도를 완화하는 장치를 무엇이라고 통칭하는가?

    버퍼 p.100

  1. 응용 프로그램과 프린터 사이에서 속도 차이를 완화하는 소프트웨어를 무엇이라고 하는가?

    스풀러 p.100

  1. 부팅 시 운영체제를 메모리로 가져오기 위해 사용하는 작은 프로그램은 무엇인가?

    부트스트랩 코드 p.97

  1. 속도가 빠르고 값이 비싼 저장장치를 CPU 가까운 쪽에 두고, 값이 싸고 용량이 큰 저장 장치를 반대쪽에 배열하는 방식을 무엇이라고 하는가?

    저장장치의 계층 구조 p.105

  1. 작업의 효율성을 높이기 위해 CPU가 입출력 관리자에게 입출력 작업을 요청하면 작업을 마친 입출력 관리자는 CPU에 무엇을 보내는가?

    인터럽트 p.107

  1. CPU의 도움 없이도 메모리를 사용할 수 있도록 입출력 관리자에게 주는 권한을 무엇이라고 하는가?

    직접 메모리 접근(DMA) p.109

  1. CPU와 입출력 관리자가 서로 다른 메모리 영역을 사용하는 기법을 무엇이라고 하는가?

    메모리 매핑 입출력(Memory Mapped I/O, MMIO) p.109

  1. CPU가 병렬 처리를 지원하지 않을 때 소프트웨어적으로 병렬 처리를 하는 기법을 무엇이라고 하는가?

    VLIW 기법(Very Long Instruction Word) p.119

    [심화문제]
    페이지로 표기

  2. 컴퓨터에서 클록이 하는 역할을 설명하시오.
    p.83

  3. 프로그램 카운터 레지스터의 역할을 설명하시오.
    p.88

  4. 제어 버스, 주소 버스, 데이터 버스에 대해 설명하시오.
    p.92

  5. 휘발성 메모리와 비휘발성 메모리를 비교하여 설명하시오.
    p.93

  6. DDR SDRAM에 대해 설명하시오
    p.94

    Node.js 생활코딩

    챕터 8까지 찢.었.다.

    근데 기본 세팅에 기본 구성에 자바스크립트 기초만 본거라 한게 없다.

var http = require("http");
var fs = require("fs");
var app = http.createServer(function (request, response) {
  var url = request.url;
  if (request.url == "/") {
    url = "/index.html";
  }
  if (request.url == "/favicon.ico") {
    return response.writeHead(404);
  }
  response.writeHead(200);
  console.log(__dirname + url);

  response.end(fs.readFileSync(__dirname + url)); // 웹서버가 웹브라우저 요청에 응답하는 명령,
});

app.listen(3000);

// node.js를 웹서버로 만들어주는 코드

하루를 마무리하며..

  1. 오늘 못한 것: 다했다 ~~
  • 반성: 생각보다 계획을 널널하게 잡았나. 데이터베이스 공부가 머리속에 잘 안들어오는 것 같다. SQL 부분 다 까먹었다
  • 피드백: 일단 모르는 부분 제낀다~
  1. 내일 할 것
  • 프로그래머스 문제 풀이
  • node js 챕터 1 9장 ~ 18장 보기
  • 원리부터 배우는 관계형 베이스 입문 3, 4장 읽기
  • 운영체제 챕터 3 복습
  • (만약 시간이 된다면) 리트코드에서 SQL 문제 풀기

0개의 댓글