TIL-2023-07-27

김민준·2023년 7월 27일
0
  1. node.js의 약점
  2. SQL : 프리징

공부하며 느낀 점
참조한 사이트

1. node.js의 약점

  • 백엔드의 예외를 적절히 처리하지 않으면, 에러 하나로도 서버가 다운 될 수 있다.
  • 변수 타입이 런타임에서 결정된다.
    치명적인 오류가 있어도 미리 알 수 없다.
  • 타입체크
    let a = 1 을 선언해서 a를 숫자로 생각했는데, 중간에 a='일'로 문자로 바뀔수도있다.
  • 객체
    객체 안에 에 key:value를 선언하고, 잘못된 key값을 불러와도, 컴파일러가 잡아주지 않고 NaN을 반환한다.

2. SQL : 프리징

스냅샷 같은 개념, DB에서 예전의 기록을 볼 DB의 현재 값을 참조하는 것이 아니라, 그 당시의 값을 저장해 두는 것

예) 메뉴 테이블의 가격은 바뀔 수 있으니, 주문 테이블의 가격은 주문 당시의 가격을 넣는다.
예) 메뉴 테이블의 이름은 바뀔 수 있으니, 주문 테이블에는 이름 대신 메뉴.id를 넣는다.

정수를 나선형으로 배치하기

빈 배열에 순선대로 값을 넣지 않아도 문제는 없는 듯하다.

  for (let i = 0; i < n; i++) {
    for (let i2 = 1; i2 <= n; i2++) {
      answer[i][i2] = i2;
    }
  }

나의 풀이

1부터 시작해야하니 i2는 1부터 증가하게 만들었는데 실수였다. 배열이 원하는 것 보다 한 칸 늘어났고 첫 칸은 안들어갔다. i2도 i와 같이 설정하고, 배열의 값은 +1 해야겠다.

또한 배치 순서와 횟수는
x축 + n 회
y축 + n-1 회
x축 - n-1 회
y축 + n-2 회
x축 + n-3 회
y축 - n-3 회....

방향은 일정하게 바뀌며, 넣어야할 갯수는 맨처음 n회를 제외하면 n-x회가 2회씩 반복됨을 알 수 있다.

또한 목적지가 바뀔때마다 x축과 y축이 번갈아가면서 고정되며, 반복 횟수는 2n-1회이다. 그리고 순서는 항상
오른쪽, 아래, 왼쪽, 위 가 반복된다.

1 오 x=1 , y=1
2 아 x=1 , y=n
3 왼 x=n , y=n
4 위 x=n , y=1

5 오 x=1+1 , y=1
6 아 x=1+1 , y=n-1
7 왼 x=n-1 , y=n-1
8 위 x=n-1 , y=1+1

자바 스크립트는 0부터 시작하므로 -1씩만해주자.

두 종류의 x와 y가 각각 +1 -1 씩 된다.
오른쪽, 위쪽은 +1
왼 쪽, 아래는 -1 씩 된다.

1 오 x= x1(1):x1(1) , y= y1(1):y2(4)
2 아 x= x1(1):x2(4) , y= y2(4):y2(4)
3 왼 x= x2(4):x2(4) , y= y2(4):y1(1)
4 위 x= x2(4):x1(2) , y= y1(1):y1(1)

5 오 x= x1(2):x1(2) , y= y1(1):y2(3)
2 아 x= x1(2):x2(3) , y= y2(3):y2(3)
3 왼 x= x2(3):x2(3) , y= y2(3):y1(2)

순으로 변한다는 것이다.
그럼
오 x1++
아 y2--
왼 x2--
위 y1++ 순서대로 바꾸어야하며 number는 항상 ++ 해야한다.

// const n = 4;
const n = 5;

answer = [];
for (let i = 0; i < n; i++) {
  answer[i] = [];
  for (let i2 = 0; i2 < n; i2++) {
    answer[i][i2] = 0;
  }
}

function roatateNumber(n) {
  let number = 1;

  let x1 = 0;
  let y1 = 0;

  let x2 = n - 1;
  let y2 = n - 1;

  let z = 0;

  n2 = z.value / 2;
  if (n2 === 0) {
    n2 = n;
  } else {
    ``;
    n2 = n - Math.ceil(n2);
  }

  while (number <= n * n) {
    // 오른쪽으로
    for (let i = y1; i <= y2; i++) {
      answer[x1][i] = number;
      number++;
    }
    x1++;
    // 아래로
    for (let i = x1; i <= x2; i++) {
      answer[i][y2] = number;
      number++;
    }
    y2--;

    // 왼쪽으로
    for (let i = y2; i >= y1; i--) {
      answer[x2][i] = number;
      number++;
    }
    x2--;

    // 위로
    for (let i = x2; i >= x1; i--) {
      answer[i][y1] = number;
      number++;
    }
    y1++;
  }
}

roatateNumber(n);

return answer;

다른 사람의 풀이 1.

하다가 정신이 나간 것 같다.

다른 사람의 풀이 2.

function solution(n) {
    const move = [[0, 1], [1, 0], [0, -1], [-1, 0]];
    const answer = Array.from(new Array(n), () => new Array(n).fill(0))
    let x = 0, y = 0, dir = 0, num = 1;
    while(num <= n * n) {
        answer[x][y] = num;
        let nextX = x + move[dir][0];
        let nextY = y + move[dir][1];
        if (nextX >= n || nextX < 0 || nextY >= n || nextY < 0 || answer[nextX][nextY] !== 0) {
            dir = (dir + 1) % 4;
            nextX = x + move[dir][0];
            nextY = y + move[dir][1];
        }
        x = nextX;
        y = nextY;
        num ++;

    }
    return answer;
}

뭔가 엄청 복잡해보이는데 결국
move에 이동할 방향을 설정하고
dir을 1 증가시키고 4로 나눈 나머지를 구해서 0~3 사이의 숫자만 나오게 해서 방향 네개가 반복되게 하는 것이다.
방향이 바뀌는 기준은,
nextX >= n nextY >= n n*n 사각형의 끝에 도달한 경우
nextY < 0 nextX < 0 또는 끝을 나간경우
answer[nextX][nextY] !== 0 다음 칸의 값이 0인 경우

를 충족하면 방향을 바꾸도록 설계되어있다.

다른 사람의 풀이3.

function solution(n) {
  // 1. create n x n grid
  const grid = [];
  for (let i = 0; i < n; i += 1) {
    const row = [];
    for (let j = 0; j < n; j += 1) {
      row.push(0);
    }
    grid.push(row);
  }

  // 2. move in spiral path and fill values
  let currentX = 0;
  let currentY = 0;
  let currentValue = 1;
  while (true) {
    // fill current cell's value
    grid[currentY][currentX] = currentValue;

    // since we start at top left corner (0,0), we always have at most two empty neighboring cells.
    const isLeftCellEmpty = grid[currentY][currentX - 1] === 0;
    const isUpperCellEmpty = grid[currentY - 1]?.[currentX] === 0;
    const isRightCellEmpty = grid[currentY][currentX + 1] === 0;
    const isLowerCellEmpty = grid[currentY + 1]?.[currentX] === 0;

    if (isLeftCellEmpty) {
      if (isLowerCellEmpty) {
        // if left down empty, move down
        currentY += 1;
      } else {
        // move left
        currentX -= 1;
      }
    } else if (isRightCellEmpty) {
      if (isUpperCellEmpty) {
        // if right up empty, move up
        currentY -= 1;
      } else {
        // move right
        currentX += 1;
      }
    } else if (isUpperCellEmpty) {
      // move up
      currentY -= 1;
    } else if (isLowerCellEmpty) {
      // move down
      currentY += 1;
    } else {
      // no place to go! escape!
      break;
    }

    currentValue += 1; // increase value to insert on next coordinate
  }

  return grid;
}

출처

코드 자체는 아까보다 긴데 이해는 더 쉽게 되어있다.

불필요한 코드를 압축하는 것도 좋지만, 역시 이해할 수 있는 선에서 압축해야한다.

공부하며 느낀 점

  1. node.js는 오류가 나기 쉽고, 그것을 잘 체크해주지 않는 듯 하니 조심해야겠다.
  2. 코드를 간결하게 쓰는것도 좋지만 이해할 수 있는 선에서 압축해야하며, 객체들의 이름도 이해하기 쉽게 선언해야한다.

참조한 사이트

nvm에서 설치된 node.js 목록 보기

빈 배열 채우기
다른 사람의 풀이3.

profile
node 개발자

0개의 댓글

관련 채용 정보