[취업준비일지] - 8
0.과제를 진행해서 강의부분은 생략되었으며
과제는 클론코딩느낌이지만 공개여부에 대한 허락을 받지 않은 상황이라
과제를 진행하며 학습한 내용들에 대해서는 작성하지 않았다.
1.터널은 이름과 유사한 기능을 하는데 다른 서버와의 통신 경로가 되어준다.
다른 프록시, 게이트웨이와의 차별성은 리퀘스트를 처리하지 않고
그대로 다음 서버로 넘겨준다.
터널을 사용할 경우 서버와 안전하게 통신할 수 있기 때문에 보안면에서 우수하다.
2.캐시 서버는 받은 리스폰스를 저장한 다음
클라이언트에서 같은 요청이 올 경우 저장된 데이터를 반환해
서버는 리퀘스트 처리 부담이 줄고 클라이언트는 더 빠른 응답을 받을 수 있게 된다.
3.클라이언트와 서버 모두 캐시를 가지고 있는데 서버에서는 오래될 경우 클라이언트, 서버에 확인을 하는 과정이 있다.
하지만 확인 과정을 진행한 후 또는 클라이언트의 유효기간 등의
제한을 담은 요청이 아닌 이상은 서버에서 데이터가 바뀌었다고 해도
캐시서버에서는 파악하지 못해 오래된 데이터를 받을 가능성도 있다.
클라이언트 내부 캐시도 마찬가지인데
새로고침, 자동로그인등의 기능을 사용하고 있는 경우 캐시로 처리될 수 있지만
그 사이에 바뀐 정보등을 받을 수는 없다.
업데이트를 하지 않고 다운받은 내용을 사용하는 어플리케이션처럼
캐시도 유사하게 사용한다고 느껴진다.
4.계수정렬(Counting Sort)은 특정 범위의 양의 정수를 정렬할 때 압도적이다.
O(N)이라는 시간복잡도를 가지고 있지만 최대값의 수치만큼 공간복잡도O(k)를 차지하며
적은 갯수에서는 오히려 O(N+k)의 시간복잡도에서 k가 훨씬 큰 사태가 발생하기도 한다.
실생활에서는 거의 사용되지 않지만 대규모 시험점수 정렬등에서 압도적인 속도를 자랑한다.
정렬은 해당 값의 배열에 1씩 추가하며 카운팅을 한 다음
역순으로 카운팅된 누적합을 제거하며 index에 추가하는 방식이다.
(1).백준 2576번 홀수 문제는 숫자들을 받아 홀수가 존재하지 않으면 -1을 출력하고 홀수가 존재할 경우 가장 작은 홀수와 홀수들의 합을 출력하는 문제였다.
filter, reduce를 통해 홀수구하기, 합 구하기를 해결했고 Math.min과 구조분해할당을 통해 최소값을 처리했다.
let input = `2
4
20
32
6
10
8`.split('\n').map(Number).filter(el => el%2)
if(input.length === 0){
console.log(-1)
}
else{
console.log(`${input.reduce((a,b) => a+b)}\n${Math.min(...input)}`)
}
(2).프로그래머스 햄버거 만들기는 시간복잡도 면에서 조금 까다로운 문제였고
햄버거 만드는 과정에서 재료처리에 대한 부분도 조금 의아했던 문제였다.
기본적으로 빵, 야채, 고기, 빵 순서로 들어가야 하며 빵,야채,고기,빵을 치환하는 while문을 사용해도 되지 않아 의아했는데 알고보니 동기적으로 처리해야 하는 문제기 때문에 처음부터 쌓아나가며 비교해야만 해결할 수 있었다.
아래와 같은 코드로 문제를 해결했으나 시간복잡도면에서 테러를 당했다.
function solution(ingredient) {
let str = ''
let count = 0
for(let i = 0 ; i < ingredient.length ; i++){
str += ingredient[i]
if(str.slice(-4) === '1231'){
str = str.slice(0,str.length-4)
count++
}
}
return count
}
생각해본 결과 쓸모없는 데이터들이 계속 잡혀있으면서 배열 재할당 등에서 시간복잡도를 O(N^2)으로 만드는 것 같았기 때문에 str의 절대적인 길이를 줄이기 위해 '22', '33', '13', '32'의 단절 순서가 들어갈 경우 앞부분을 지워버렸다.
function solution(ingredient) {
let str = ''
let count = 0
let arr = ['22', '33', '13', '32']
for(let i = 0 ; i < ingredient.length ; i++){
str += ingredient[i]
if(str.slice(-4) === '1231'){
str = str.slice(0,str.length-4)
count++
}
if(arr.includes(str.slice(-2))){
str = ''
}
}
return count