- node.js의 약점
- SQL : 프리징
공부하며 느낀 점
참조한 사이트
let a = 1
을 선언해서 a
를 숫자로 생각했는데, 중간에 a='일'
로 문자로 바뀔수도있다.스냅샷 같은 개념, 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;
}
코드 자체는 아까보다 긴데 이해는 더 쉽게 되어있다.
불필요한 코드를 압축하는 것도 좋지만, 역시 이해할 수 있는 선에서 압축해야한다.