2022.8.22. 월요일 공부기록: 프로그래머스 숫자 문자열과 영단어, Nodejs 구현 공부, 운영체제 3장 복습

Dorito·2022년 8월 22일
0

공부 기록

목록 보기
8/71

하루 목표

프로그래머스 문제 풀이
node js 챕터 1 9장 ~ 18장 보기
원리부터 배우는 관계형 베이스 입문 3, 4장 읽기
운영체제 챕터 3 복습
(만약 시간이 된다면) 리트코드에서 SQL 문제 풀기

프로그래머스 숫자 문자열과 영단어

https://school.programmers.co.kr/learn/courses/30/lessons/81301?language=javascript

문자열 관련 다루는거 아직 너무 어렵다..

https://github.com/ziishaned/learn-regex/blob/master/translations/README-ko.md

정규식 관련 괜찮은 레포!


const solution = (str) => {
  const numbersRegex = [
    /zero/g,
    /one/g,
    /two/g,
    /three/g,
    /four/g,
    /five/g,
    /six/g,
    /seven/g,
    /eight/g,
    /nine/g,
  ];

  for (let i = 0; i < 10; i++) {
    str = str.replace(numbersRegex[i], i);
  }
  return Number(str);
};

다른 사람 풀이 오브젝트 써서 푸는거 궁금했는데 신기하다!

function solution(s) {
    let charSet = {
        "zero" : 0,
        "one" : 1,
        "two" : 2,
        "three" : 3,
        "four" : 4,
        "five" : 5,
        "six" : 6,
        "seven" : 7,
        "eight" : 8,
        "nine" : 9,
    }

    for(let [key, value] of Object.entries(charSet)) {
        let re = new RegExp(key, "g");
        s = s.replace(re, value);
    }
    return parseInt(s);
}
**new RegExp(`${key}`,"g");** 

코드 부분 ->
RegExp 백틱으로 변수 변환 필요 없음.

RegExp(key, "g");

로 적어주면 됨

더 쩌는 풀이

const solution = (s) => {
  let numbers = [
    "zero",
    "one",
    "two",
    "three",
    "four",
    "five",
    "six",
    "seven",
    "eight",
    "nine",
  ];
  var answer = s;

  for (let i = 0; i < numbers.length; i++) {
    let arr = answer.split(numbers[i]);
    answer = arr.join(i);
  }

  return Number(answer);
};

joinsplit을 그냥 단순히 배열<->문자열 전환으로만 생각하지 않고 정확하게 알고 있어야 함

arr이라는 변수를 따로 생성하지 않고 answer = answer.split(numbers[i]).join(i); 처럼 answer에 바로 대입하는 것도 괜찮을까요? arr를 생성해서 대입하는 이유

split함수의 반환값을 쓰기 위해서입니다. split을 쓴 answer는 변하지 않습니다.

const numToString = [
  "zero",
  "one",
  "two",
  "three",
  "four",
  "five",
  "six",
  "seven",
  "eight",
  "nine",
];
const solution = (s) => {
  return +numToString.reduce((acc, cur, idx) => {
    if (s.includes(cur)) {
      return acc.replace(new RegExp(cur, "g"), idx);
    } else return acc;
  }, s);
};

Nodejs

아.. node js 관련 글 써둔거 다 날라갔다. ㅠㅠㅠㅠ 임시저장 불러오기 취소 눌러버림..
9장에서 23장까지 정리!

쿼리스트링: 65p ? 뒤에 나와있는 것들~

아무튼 핵심만..
url.parse 가 deprecate 되어서 21년도 3월 이후엔 작동이 되지 않습니다.
강의 진행 중 get을 읽을 수 없다던지 그런 메세지가 cmd에 뜨면 이렇게 바꾸면 됨

let queryData = url.parse(_url, true).query;

에서

var queryData = new URL('http://localhost:3000' + _url).searchParams;

var http = require('http');
var fs = require('fs');
var url = require('url'); 
// main.js에서 url이라는 변수를 통해 Node.js의 url모듈에 담긴 기능을 사용할 수 있다.


var app = http.createServer(function(request,response){
var _url = request.url; // 사용자가 요청한 url

if(_url == '/'){
url = '/index.html';
}
if(_url == '/favicon.ico'){
response.writeHead(404);
response.end();
return;
}
response.writeHead(200);
//console.log(__dirname + url);
response.end(queryData.id);

});
app.listen(3000);

오늘 완성 코드

let http = require("http");
let fs = require("fs");
let url = require("url");

let app = http.createServer(function (request, response) {
  let _url = request.url;
  let queryData = url.parse(_url, true).query;
  let pathname = url.parse(_url, true).pathname;

  if (pathname === "/") { // 홈일 때
    if (queryData.id === undefined) {
      let title = "Welcome"; // 홈 제목
      let description = "Hello, Node.js"; // 홈 내용
      let template = `
            <!doctype html>
            <html>
                <head>
                    <title>WEB1 - ${title}</title>
                    <meta charset="utf-8">
                </head>
                <body>
                    <h1><a href="/">WEB</a></h1>
                    <ul>
                        <li><a href="/?id=HTML">HTML</a></li>
                        <li><a href="/?id=CSS">CSS</a></li>
                        <li><a href="/?id=JavaScript">JavaScript</a></li>
                    </ul>
                    <h2>${title}</h2>
                    <p>${description}</p>  // 읽어온 파일 내용 표시
                </body>
            </html>
            `;
      response.writeHead(200);
      response.end(template);
    } else { // 홈이 아닐 때
      fs.readFile(
        `../data/${queryData.id}`, 
        "utf8",
        function (err, description) {  
/* fs.readFile(`../data/${queryData.id}`,"utf8", function(err, description) {  
fs모듈의 readFile 기능으로 파일을 읽고, 
그 내용을 description 변수에 저장
쿼리스트링이 있다면 홈이 아니고, 쿼리 스트링이 없다면 홈으로 구분할 수 있다. 
즉, 사용자가 요청한 쿼리 스트링을 가지고 있는 queryData.id로 구분하면 됨 */
          let title = queryData.id; // 쿼리 스트링에서 제목을 가져옵니다.
          let template = `
                <!doctype html>
                <html>
                    <head>
                        <title>WEB1 - ${title}</title>
                        <meta charset="utf-8">
                    </head>
                    <body>
                        <h1><a href="/">WEB</a></h1>
                        <ul>
                            <li><a href="/?id=HTML">HTML</a></li>
                            <li><a href="/?id=CSS">CSS</a></li>
                            <li><a href="/?id=JavaScript">JavaScript</a></li>
                        </ul>
                        <h2>${title}</h2>
                        <p>${description}</p> // 읽어온 파일 내용 표시
                    </body>
                </html>
                `;
          response.writeHead(200);
          response.end(template);
        }
      );
    }
  } else {
    response.writeHead(404);
    response.end("Not found");
  }
});
app.listen(3000);

node js es6 import vs require

여기 코드에서는 require 쓰는데 node js es6 import vs require 검색해보면
1. import * as fs from 'fs';
2. const fs = require('fs');

이런식으로 쓴다.. 여기서 궁금해서 찾아봄 es6란? 자바스크립트 버전 같은거다..

최근 ES6(ES2015) 모듈 시스템인 import가 많이 사용되고 있지만, 아직까지는 import 키워드가 100% 대체되어 사용될 수 없습니다.
<script> 태그를 사용하는 브라우저 환경과, NodeJS에서도 CommonJS를 기본 모듈 시스템으로 채택하고 있기 때문에, Babel과 같은 ES6 코드를 변환(transpile)해주는 도구를 사용할 수 없는 경우에는 require 키워드를 사용해야 합니다.
출처

Nodejs fs모듈: 파일 읽기

https://nodejs.dev/en/learn/reading-files-with-nodejs

The simplest way to read a file in Node.js is to use the fs.readFile() method, passing it the file path, encoding and a callback function that will be called with the file data (and the error):

운영체제 챕터 3: 프로세스와 스레드 정답

쉽게 배우는 운영체제 책 문제 풀이입니다

https://www.youtube.com/watch?v=x-Lp-h_pf9Q&ab_channel=%EB%84%90%EB%84%90%ED%95%9C%EA%B0%9C%EB%B0%9C%EC%9E%90TV

영상도 꼭 보기!

[연습문제]

  1. 프로그램이 프로세스가 되려면 운영체제로부터 무엇을 받아야하는가?

    PCB, 프로세스 제어 블록 = 메모리를 할당 받은 프로그램, p.137
    운영체제가 해당 프로세스를 위해 관리하는 데이터 구조
    프로세스 = 프로그램 + 프로세스 제어 블록

  1. 프로세스의 상태 중 CPU를 할당받기 위해 기다리는 상태는 무엇인가?

    준비 상태 p.139

  1. 프로세스의 상태 중 입출력 작업을 하기 위해 이동하는 상태는 무엇인가?

    대기 상태(Blocking status) p.140

  1. CPU 스케줄러가 준비 상태에 있는 프로세스 중 하나를 골라 CPU를 할당하는 작업을 무엇이라고 하는가?

    디스패치 p.140
    디스패치는 보내다, 파견하다 의미 가짐 = 선택해서 꺼낸다 의미
    NOTE: 대기 상태를 추가한 프로세스 상태: p.141

  1. 유닉스에서 Ctrl + Z 키를 눌러 프로세스가 중단되면 프로세스는 어떤 상태로 바뀌는가?

    휴식 상태 p.143~144 (cf. 보류: cpu 뺏긴다)

  1. 실행 상태에서 하나의 프로세스가 나가고 새로운 프로세스가 들어오는 상황을 무엇이라고 하는가?

    문맥 교환(Context Switching) p.149

  1. 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 시스템 호출은 무엇인가?

    fork() 시스템 호출 p.153

  1. 프로세스의 골격은 그대로 둔 채 코드영역만 바꾸는 시스템 호출은 무엇인가?

    exec() ~ execute 줄임말임 ~ p.153

  1. 부모 프로세스가 기다리지 않아 자원이 회수되지 못하고 계속 살아 있는 프로세스 무엇인가?

    고아/미아/좀비 프로세스 p.162

  1. 프로세스의 코드에 정의된 절차에 따라 CPU에 작업 요청을 하는 실행 단위로서 가벼운 프로세스라고 불리는 것은 무엇인가?

    스레드 p.164

  1. 미아 프로세스를 방지하기 위해 부모 프로세스는 어떤 시스템 호출을 사용하는가?

    exit(), return(), wait() p.163, 185

  1. 작업이 끝난 프로세스의 자원을 회수하는 행위를 무엇이라고 하는가?

    가비지 컬렉션 스레드 수집 p.162

  1. 모든 프로세스를 부모-자식 관계로 만들어 자원 회수를 용이하게 하는 프로세스의 구조는 무엇인가?

    프로세스 계층 구조 p.160

[심화 문제]

  1. 다섯 가지 프로세스 상태도를 그리시오.
    p.141, 145

  2. 프로세스의 상태 중 휴식 상태와 보류 상태에 대해 설명하시오.
    p.143

  3. 프로세스 제어 블록의 구성에 대해 설명하시오.
    p.137, 146
    NOTE) 프로세스 구조: p.152, 179

  4. 문맥 교환에 대해 설명하시오.
    p.149

  5. 프로세스를 구성하는 코드 영역, 데이터 영역, 스택영역에 대해 설명하시오.
    p.152

  6. fork() 시스템 호출의 장점을 설명하시오.
    p.155, 180

  7. exec() 시스템 호출의 장점을 설명하시오.
    p.157

  8. 프로세스 계층 구조의 장점을 설명하시오.
    p.161, 162 + 다중사용자 처리, 회수

  9. 멀티스레드, 멀티 태스킹, 멀티프로세싱, CPU 멀티스레드를 비교하여 설명하시오
    멀티스레드: p.167
    멀티태스킹: p.170

    멀티프로세싱: p.168
    CPU멀티스레드: p.168

추가 필기: 멀티스레드와 멀티태스킹 차이 (p.167)

  • 멀티스레드: 멀티스레드는 프로세스 내 작업을 여러 개 스레드로 분할함으로써 작업의 부담을 줄이는 프로세스 운영 기법이다
    -> 전역 변수나 함수 호출 방법으로 스레드 간 통신
    동시성 문제 -> 동기화 이슈!
  • 멀티태스킹: 운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법 (시분할 기법)
    -> 서로 독립 전역 변수나 함수 호출 방식으로 호출

하루 돌아보기

  • 오늘 못한 것
    원리부터 배우는 관계형 베이스 입문 3, 4장 읽기
  • 피드백
    관계형데이터베이스 cs 이론 공부를 빨리 끝내자!
    이제 구현 위주로 공부 파보자

  • 오늘 잘한 것
    구현 관련 진도 더 많이 나가서 기분 좋다!
    알고리즘 문제 풀이 요령을 알게되어서 다행인 것 같다.

  • 내일 할 것
    내일 여행 감! (8/23~25) >.O

여행 돌아와서!!!

프로그래머스 문제 1개 풀기
운영체제 공부 챕터 4
네트워크 공부

0개의 댓글