1.var와 let은 기능적으로는 유사하지만
var는 전역 유효 범위와 함수의 유효 범위만 지니고
let은 중괄호 범위 내에서 유효하기 때문에
var를 조건문 등에서 사용할 경우 전역적으로 선언되는 것을 막을 수 있다.
2.화살표 함수에 type을 배정하고 싶은 경우
const "functionName" : (x:number, y:number) => number = (x,y) => x+y 형태로 할 수 있다.
3.구조분해 할당에서 객체로 꺼내올 때는 {a,b} = obj 형태라는 것은 알고 있었지만 이름을 변경하는 것을 모르고 있었는데
{a : anotherName, b} = obj 형태로 한다면 a,b로 지정된 키의 값이 anotherName과 b에 할당된다.
키:값이 아닌 "불러올 값의 키" : "새로운 변수명"이라고 봐야 한다.
4.HTML은 1993년 모자이크라는 브라우저가 해석할 수 있는 HTML1.0을 시작으로
1999년 HTML4.0이 출시되었고
2014년 THML5가 출시되었다.
CSS는 Cascading Style Sheets의 약자로 HTML요소를 어떻게 표시할지를 지시하는 사양 중 하나다.
DOM은 HTML내의 요소를 다루기 위한 API로
HTML내의 요소를 오브젝트로 다뤄 여러가지 작업을 할 수 있다.
웹 어플리케이션에 대한 내용들도 있지만
15년도에 발행되어서 그런지 JS에 대한 내용은 뒤에 아주 조금만 나오고
거의 다루지 않는다. Java를 이용한 서블릿 등은 딱히 유용하지 않아 보인다.
5.배열 회전은 마지막 값을 저장한 다음 나머지(처음부터 마지막 전) 배열들의 위치를 한칸씩 뒤로 당겨준다.
그 뒤 맨 앞에 저장해둔 마지막 값을 저장하는 방식으로 회전 알고리즘을 구현할 수 있다.
6.저글링 알고리즘은 회전 알고리즘과 유사한 구성을 가지고 있지만 인덱스를 묶어서 회전시킨다고 하는데 i++대신 i+=3과 같은 형태로 처리해주면 될 것 같다.
7.역전 알고리즘은 회전을 여러번 진행하는 대신 회전 숫자에 맞춰 구간을 reverse로 구현하는 방식으로 1,2,3,4,5,6,7,8,9가 존재하며 4번 회전해야 한다고 할 경우 1,2,3,4 / 5,6,7,8,9로 나눈 다음 각자 반전 처리해 4,3,2,1 / 9,8,7,6,5 로 만들어 합친 다음(4,3,2,1,9,8,7,6,5) 그 배열을 다시 반전시켜 5,6,7,8,9,1,2,3,4로 만드는 방식이다.
이렇게 이상한 짓을 할 것 같으면 그냥 1,2,3,4를 5,6,7,8,9의 뒤에 붙이면 될 것 같은데 굳이 역전 알고리즘을 사용하는 이유는 모르겠다.
(아마 C++과 JS의 차이가 있을 수 있다는 생각도 든다)
8.배열의 회전 최대 값 구하기는 i * arr[i] 형태로 내부 값을 곱하는 경우를 예시로 보여주는데 이전값과 다음값의 차이는 배열의 모든 값의 합과 그 상태의 처음에 있는 값에 index만큼을 곱한 값을 뺀 만큼이다.
공식으로 표현하자면 arrSum -n*arr[0]이라고 할 수 있다.
이는 n과 j로 표기해 처리하기 위해서는 X(j) - X(j-1) = arrSum - n * arr[n-j]로 볼 수 있는데 마지막을 모든 값들은 index가 1씩 증가해 하나씩 늘어나지만 마지막 값은 n-1에서 0으로 줄어들기 때문에 n-1을 곱해야 하고 거기에 배열의 모든 합을 arrSum으로 뒀기 때문에 n-1이 아닌 n을 곱한다.
(1).백준 2985 세 수는 주어진 세 수를 가지고 할 수 있는 연산을 구하는 문제로 여러 조건으로 분기해야 풀 수 있는 문제였다.
단순히 덧셈, 뺄셈, 곱셈, 나눗셈을 각각 숫자당 두번씩 총 여덟번의 분기를 통해 문제를 해결할 수 있다.
let [a,b,c] = `5 15 3`.split(' ').map(Number)
if(a+b === c){
console.log(`${a}+${b}=${c}`)
}
else if(a === b+c){
console.log(`${a}=${b}+${c}`)
}
else if(a-b === c){
console.log(`${a}-${b}=${c}`)
}
else if(a === b-c){
console.log(`${a}=${b}-${c}`)
}
else if(a/b === c){
console.log(`${a}/${b}=${c}`)
}
else if(a === b/c){
console.log(`${a}=${b}/${c}`)
}else if(a*b === c){
console.log(`${a}*${b}=${c}`)
}
else if(a === b*c){
console.log(`${a}=${b}*${c}`)
}
(2).프로그래머스 과일 장수는 박스에 가장 품질이 떨어지는 사과를 기준으로 가격을 매기는 문제로 상위 사과부터 박스에 포장하는 방식으로 문제를 해결할 수 있다.
생각없이 풀었다면 sort를 사용해 뒤에서부터 자를 수 있었지만
시간복잡도를 따질 것 같은 느낌적인 느낌이 들었기 때문에
전체 값을 obj에 넣는 O(N)으로 처리한 다음
다시 객체를 조회해 기존 O(N)보다 적은 조횟수(9언더)로
사실상 O(N)으로 해결된 것 같다.
스코어의 길이가 100만개까지 있다고 하는데 최대 시간이 9.64ms면 빠른 편인 것 같다.
function solution(k, m, score) {
let scoreObj = {}
let answer = 0;
for(let i = 0 ; i < score.length ; i++){
if(scoreObj[score[i]]){
scoreObj[score[i]]++
}
else{
scoreObj[score[i]] = 1
}
}
for(let i = k ; i > 0 ; i--){
if(scoreObj[i]){
answer += Math.floor(scoreObj[i]/m)*i*m
if(scoreObj[i-1]){
scoreObj[i-1] += (scoreObj[i] - Math.floor(scoreObj[i]/m)*m)
}
else{
scoreObj[i-1] = (scoreObj[i] - Math.floor(scoreObj[i]/m)*m)
}
}
}
return answer;
}
'회고' 카테고리의 다른 글
[취업준비일지] - 25 (0) | 2022.11.14 |
---|---|
[취업준비일지] - 24 (0) | 2022.11.13 |
[취업준비일지] - 22 (0) | 2022.11.11 |
[취업준비일지] - 21 (0) | 2022.11.10 |
[취업준비일지] - 20 (0) | 2022.11.09 |