항해 99 5기 TIL_60
▶ Today I Learned
<알고리즘>
[평범한 배낭]
소요시간: 1시간 37분 + 33분 = 2시간 10분
해결여부: 해결
백준 12865번
https://www.acmicpc.net/problem/12865
let fs = require("fs");
let knapsack = fs.readFileSync("dev/stdin").toString().split("\n");
const N = Number(knapsack[0].split(" ")[0]);
const K = Number(knapsack[0].split(" ")[1]);
knapsack = knapsack.map((element) =>
element
.trim()
.split(" ")
.map((value) => Number(value))
);
const weight = [];
const value = [];
for (let n = 0; n <= N; n++) {
weight.push(knapsack[n][0]);
value.push(knapsack[n][1]);
}
const dp = Array.from(new Array(N + 1), () => new Array(K + 1));
// 가로 세로 길이가 N + 1, K + 1 인 테이블을 만든다고 생각하면 쉬움
for (let i = 0; i <= N; i++) {
dp[i][0] = 0; // 행렬 중 열이라 보면 됨, 몇번째 물건인지를 나타냄
}
for (let j = 0; j <= K; j++) {
dp[0][j] = 0; // 행렬 중 행이라 보면 됨, 물건의 무게를 나타냄
}
//테이블의 0번째 행이나 열은 모두 0을 채워넣어줌!
// 물건의 갯수가 0인 경우가 없고 감당 가능한 무게가 0인 경우 역시 없기 때문!
// 각 행과 열이 만나는 지점은 n번째 물건의 k무게에 대한 가치를 나타냄
for (let j = 1; j <= K; j++) {
if (knapsack[1][0] <= j) {
dp[1][j] = knapsack[1][1];
} else {
dp[1][j] = 0;
}
}
for (let i = 2; i <= N; i++) {
for (let j = 1; j <= K; j++) {
if (j < weight[i]) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
// dp[i - 1][j]: 예를 들어 현재 물건이 2번쨰고 감당가능 무게가 4라면 첫번째 물건이 감당가능 무게가 4일때 갖는 가치가 몇인지를 나타냄,
// 이 경우는 dp[1][4]가 될 것이고 해당하는 가치는 0임, 첫번째 물건의 무게가 6이기 때문에 감당가능 무게가 4일 때 배낭에 들어갈 수가 없음
// dp[i - 1][j - weight[i]] + value[i]: 예를 들어 현재 물건이 2번째고 감당가능 무게가 4인 경우, 두번째 물건은
// 예제에서 무게가 4이므로 배낭이 감당가능, 그렇다면 배낭에 집어넣은 두번째 물건의 무게인 weight[2]만큼을 수용가능 무게에서 뺴줄 것이고
// 남은 감당가능무게인 [4 - weight[2]]를 가지고 첫번째 물건인 dp[1]를 찾음, dp[1][0] === 0 이므로
// 0 + 8(value[2]임) === 8 임, 그렇다면 0과 8 중 최댓값은 8이므로 8이 출력되는 구조임
// 이런 식으로 끝까지 연산하면 답이 나옴,
// 여기서 반복문을 i=1인 경우와 i=2인 경우로 나눈 이유는 i=2인 경우의 식을 적용할 때 i-1이 사용되고
// i=1인 경우를 같이 넣어버리면 0으로만 이루어져있어 의미없는 dp[0]이 들어가버리기 때문!
}
}
}
console.log(dp[N][K]);
처음엔 이해가 힘들었지만 아래 참고자료의 표 설명을 읽고 난 후 해설을 하나하나 들여다보니
이해할 수 있었다.
다음 번에 해설을 참고하지 않고 스스로 식을 짜본다면 분명히 더 이해가 잘 될 것이다!
cf) 이런 문제 유형을 동적 프로그래밍 중 배낭 문제라 칭한다고 한다.
배낭 문제 참고자료:
https://nyang-in.tistory.com/279?category=855466
https://nyang-in.tistory.com/280
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/from
<CS>
[Preflight]
공식문서에 따르면 다음과 같다.
A CORS preflight request is a CORS request that checks to see if the CORS protocol is understood and
a server is aware using specific methods and headers.
즉, CORS 프로토콜이 식별되고 서버가 특정한 메소드와 헤더를 사용한다는 것을 알고 있는지 확인하는 CORS의 request라고 한다.
Preflight 요청은 브라우저에서 어떤 요청을 보내기 전 Options라는 요청으로써 자동으로 이루어지기 때문에 프론트엔드
개발자가 이를 직접 만들어 줄 필요가 없다.
OPTIONS는 Access-Control-Request-Method, Access-Control-Request-Headers, 그리고 Origin header라는
세 가지의 HTTP 헤더를 사용한다.
예를 들어 클라이언트에서 서버에게 DELETE라는 메소드를 요청할 수 있는지 요청 전에 Preflight 요청을 먼저 하게 된다.
만약 서버가 이 메서드를 허용한다면 아래와 같이 해당 DELETE를 담고 있는 Access-Control-Allow-Methods라는 응답 헤더로 응답하게 된다.
HTTP/1.1 204 No Content
Connection: keep-alive
Access-Control-Allow-Origin: https://foo.bar.org
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
Access-Control-Max-Age: 86400
cf) 여기서 동일한 URL에 대해서는 Access-Control-Max-Age라는 것을 사용하여 지정된 시간 동안 해당 URL의 해당 요청에 대한 응답을 캐쉬로 저장할 수도 있다.
참고자료:
https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request
▶ 느낀 점
알고리즘의 난이도도 점점 올라가고 웹에 대해서 알아야 할 것도 점점 늘어나고 있다.
여전히 지식의 바다, 홍수 속에 있지만 그래도 이 과정이 꽤나 즐겁기도 하다.
오늘도 이렇게 조금 성장한 자신을 격려해본다.
내일도 화이팅팅! :3
▶ 공부 시 참고 링크들
https://juhi.tistory.com/8#recentComments
[Node.js] socket.io로 실시간 채팅 구현하기 (1)
🔨 socket.io Install socket.io를 사용하면 실시간으로 클라이언트와 클라이언트 사이에서 반응을 전달할 수 있다. 즉, 실시간 상호작용을 가능하게 하는 웹소켓을 위한 모듈이다. npm install --save socket.
juhi.tistory.com
https://juhi.tistory.com/9?category=976170
[Node.js] socket.io로 실시간 채팅 구현하기(2) + 실시간 이미지 전송
socket.io 아래 코드에서 사용될 메소드와 이벤트 등에 대한 설명은 이전 포스팅_"[Node.js] socket.io로 실시간 채팅 구현하기(1)" 을 참고하면 된다. 🧁 프로젝트 목표 채팅방을 생성할 수 있고, 해당
juhi.tistory.com
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
Array.from() - JavaScript | MDN
The Array.from() static method creates a new, shallow-copied Array instance from an array-like or iterable object.
developer.mozilla.org
https://sangwoo0727.github.io/network/Network-1_HttpMethod/
[네트워크] HTTP 메소드, 안정성,멱등성,캐시가능성
이번 포스팅에서는 HTTP 메세지 중, 요청 줄에 존재하는 메서드에 대해 알아보려한다.
sangwoo0727.github.io