function solution(sizes) {
var answer = 0;
let maxArr = [];
let minArr = [];
//배열안의 두 값을 비교해서 큰값은 0번 인덱스로, 작은값은 1번인덱스로 자리를 바꿔준다.
for (let i = 0; i < sizes.length; i++) {
if (sizes[i][0] < sizes[i][1]) {
sizes[i] = sizes[i].reverse();
}
}
//최대값끼리(0번 인덱스끼리), 최솟값끼리(1번 인덱스끼리) 배열 만들기
for (let i = 0; i < sizes.length; i++) {
maxArr.push(sizes[i][0]);
minArr.push(sizes[i][1]);
}
console.log(maxArr, minArr);
// 0번 인덱스의 최댓값 과 최솟값의 곱
// min, max 함수는 각각 () 안에 나열된 수를 비교하는 것이기 때문에 배열 그대로 넣으면 오류, 전개연산자를 이용하여 객체나 배열의 원소들을 하나씩 꺼내어서 펼쳐서 리턴시켜야 한다.
answer = Math.max(...maxArr) * Math.max(...minArr);
return answer;
}
이때 Math.max를 사용할때 배열을 그냥 집어넣었더니 안됐고, 찾아보니 그냥 쉼표로 나열된 수를 넣어줘야했다.
쉽게 할 수 있는 방법이 없나 찾아보던도중 전개연산자를 알게 되었고, 배열의 원소들을 하나씩 꺼내서 넘겨주기 때문에 적용할 수 있다는 것을 알게 되었다.
function solution(lottos, win_nums) {
// 포함하지 않는값
let arr1 = lottos.filter((x) => !win_nums.includes(x));
// 중복값 == 맞춘 최소 숫자
let arr2 = lottos.filter((x) => win_nums.includes(x));
// lottos에 포함된 0의 갯수
let zero = lottos.filter((x) => x === 0);
// 3가지 예외 경우
if (zero.length == 6) {
// lottos에 0이 6개면 1 or 6등이므로
return [1, 6];
} else if (arr2.length == 6) {
// lottos를 전부 다 맞추면 1등만이므로
return [1, 1];
} else if (arr1.length == 6) {
// lottos를 전부 다 틀릴 경우
return [6, 6];
} else {
// 두 경우 다 아니라면 arr2의 갯수와 zero의 갯수로 최고, 최저 순위를 구할 수 있다.
return [7 - arr2.length - zero.length, 7 - arr2.length];
}
}
이것은 if문으로 예외를 만들어 처리하는것이 2개의 예외는 test에 나오는데 lottos를 전부 다 틀릴경우는 나오지 않았다. 지금보니 그렇게 생각하는게 어렵지 않은것처럼 보이는데 ㅎㅎ 그 당시에는 조금 까다로웠던것 같다. 문제도 읽고 싶지않게 길기 때문에 괜히 어려워보이기도했는데, 막상 풀어보니 그렇게 어렵지는 않은듯..?
사실 이문제는 sort 함수를 이용해서 하면 분명 풀릴것 같은데 내부에 조건문을 제대로 못써서 고민하다가 답을 확인하였다.
function solution(strings, n) {
let answer = strings.sort((a, b) => {
// n번째 인덱스끼리 비교하여 a[n]이 크면 1을 반환하여 a와 b의 자리를 바꾼다.
if (a[n] > b[n]) return 1;
// n번째 인덱스끼리 비교하여 b[n]이 크면 -1을 반환하여 a와 b의 자리를 바꾸지 않는다.
if (a[n] < b[n]) return -1;
// n번째 인덱스끼리 비교했을때 두값이 같다면 a와 b를 비교
if (a[n] === b[n]) {
if (a > b) return 1;
if (a < b) return -1;
return 0;
}
});
return answer;
}
JWT는 Json Web Token의 약자로 일반적으로 클라이언트와 서버 사이에서 통신할 때 권한을 위해 사용하는 토큰이다. 웹 상에서 정보를 Json형태로 주고 받기 위해 표준규약에 따라 생성한 암호화된 토큰으로 복잡하고 읽을 수 없는 string 형태로 저장되어있다.
JWT의 구성요소
JWT는헤더(header),페이로드(payload),서명(signature)세 파트로 나눠져 있으며, 아래와 같은 형태로 구성되어 있다.
JWT의 동작원리
JWT의 동작원리에 대해서는 다음과 같이 설명할 수 있다.
사용자가 id와 password를 입력하여 로그인 요청을 한다.
서버는 회원DB에 들어가 있는 사용자인지 확인을 한다.
확인이 되면 서버는 로그인 요청 확인 후, secret key를 통해 토큰을 발급한다.
이것을 클라이언트에 전달한다.
서비스 요청과 권한을 확인하기 위해서 헤더에 데이터(JWT) 요청을 한다.
데이터를 확인하고 JWT에서 사용자 정보를 확인한다.
클라이언트 요청에 대한 응답과 요청한 데이터를 전달해준다.
2. API(Application Programming Interface)
API는 정의 및 프로토콜 집합을 사용하여 두 소프트웨어 구성 요소가 서로 통신할 수 있게 하는 메커니즘입니다.
만약 자판기를 우리가 사용하고자 한다.
우리는 자판기 기계가 내부적으로 어떻게 동작하는지 몰라도 인터페이스를 통해 기계를 쉽게 사용할 수 있다.
다양한 기기에서 서버에 잇는 데이터를 읽고 쓰기 위해서는 서버에서 제공하는 Web API를 이용해서 처리할 수 있습니다.
네트워크에서 기기들과 의소소통을 해나가는 규격사항을 HTTP라고 부르고 이런 Web API를 어떻게 디자인해서 만들건지 정의하는 것이 있다.
과거에는 SOAP이라는 모든 네트워크 요청과 반응을 HTML처럼생긴 XML이라는 데이터 포맷에 저장해서 주고 받았다면,
요즘에는 REST가 보편적으로 많이 사용되어진다.
REST는 총 4가지로 구성되어져 있다.
=> Post, Get, Put, Delete
=> Get을 이용하여 유저에 대한 정보를 요청하면 서버로부터 유저에 대한 데이터를 JSON이라는 포맷을 통해서 받아올 수 있다.
이처럼 서버에서 제공하는 Web API를 통해서 서버에 있는 데이터를 읽어오거나 업데이트 할 수 있습니다.
이제는 이런 Web API 뿐만아니라 라이브러리나 프레임워크에서 이용할 수 있는 클래스나 함수들을 API라고 부른다.
=> filesAPIs, DOMAPIs, LocationAPIs....
이처럼 API들은 내부에서 구현사항들을 잘 숨겨두고 외부에서 사용하는 사람이 필요한 것만 노출해 두고 이것을 인터페이스, API라고 부른것.
2. 좋았던점
좋은 팀을 만나 하나의 결과물을 낸 것
처음 도전해서 막막했던 알고리즘 문제도 쉬운난이도지만 하나씩 해결해 나가면서 마라톤 문제들을 끝냈다는것.
3. 개선할점 / 아쉬운점
아무래도 하루를 끝낼즈음에 TIL을 몰아서쓰려니 쉽게 쓰여지지 않고, 정리할 양이 많아져서 쓰는게 쉽지 않아진다.
문제를 풀면서 배우는게 있을때, 간단하게라도 원리나 개선사항을 메모장에 적어놓는 습관을 들였으면 시간도 절약하고, 효율적으로 TIL을 쓸 수 있었을 것.
process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
const n = data.split(" ");
const a = Number(n[0]), b = Number(n[1]);
console.log(a);
console.log(b);
});
난생처음 제대로 풀어보는 알고리즘 문제라 어떤식으로? 뭘 건드려야 정답제출이 되는거지 같은 것도 감이 안잡혀서 고민했던 문제이다.
process.stdin.setEncoding("utf8");
process.stdin.on("data", (data) => {
const n = data.split(" ");// 받은 데이터를 공백으로 나눈다.
const a = Number(n[0]),// n의 0번째 값
b = Number(n[1]);// n의 1번째 값
const str = "*".repeat(a);//*을 a번 반복한다.
//직사각형의 세로길이가 b이고, i가 0부터 시작이니까 <를 사용
for (let i = 0; i < b; i++) {
// str을 b-1번 반복, i가 0부터 시작이니까
console.log(str);
}
});
글자 가운데오게 하기
function solution(s) {
// 5글자의 경우 2
let i = s.length / 2;
// 홀수인지 짝수인지 판별
let j = i % 2;
if (j) {
// 홀수인 경우
let k = s[Math.floor(i)];
var answer = k;
} else {
//짝수인 경우
let k = s[i - 1] + s[i];
var answer = k;
}
return answer;
}
없는 숫자 더하기
0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.
function solution(numbers) {
let arr1 = [];
let sum = 0;
for (let i = 0; i < 10; i++) {
arr1.push(i);
}
let difference = arr1.filter((x) => !numbers.includes(x));
for (let i = 0; i < difference.length; i++) {
sum += difference[i];
}
var answer = sum;
return answer;
}
이문제는 filter를 사용하고 싶었는데, 찾아보다가 includes의 존재를 알게 되어 사용.
개선해야할점
1. 자바스크립트 문법과 자료형, 기본 문법등 전체적으로 부족하다.
=> 기본적인 for문과 if 문을 이용하는 것밖에 모르고 좀 더 문제를 쉽게 간결하게 풀어주는 메소드를 활용하지 못함.
=> 내가 푼문제도 중요하지만 새로운 해답이 없는지 찾아보거나 다른 해답도 참고해가며 풀이.