프로그래머스
세션 기반 인증과 토큰 기반 인증의 차이공부하면 느낀 점
참조한 페이지
function solution0(phone_number) {
var answer = '';
const length = phone_number.length
const nonHide = length-4
var arr = Array.from(phone_number)
for (let i = 0 ; i < length ; i++){
if (i < nonHide){
answer += '*'
} else {
answer += arr[i]
}
}
return answer;
}
전화번호 길이-4
아래로는 *
을 넣고 아니면 해당 요소의 값을 넣어서 문제를 해결했다.
// 다른 사람의 풀이1
function solution1(s){
var result = ""
var i = 0;
while (i < s.length-4)
{
result += "*";
++i;
}
result += s.substring(i, i+4);
return result;
}
나의 풀이와 비슷하지만 배열로 바꾸는 과정을 없애고, 불필요한 반복 4회를 제거한것이 인상적이다.
// 다른 사람의 풀이2
function solution2(s){
return s.replace(/\d(?=\d{4})/g, "*");
}
정규식을 활용한 것이 신기하다.
\d
: 숫자
/g
: 전역
(?=\d{4})
: 숫자 뒤에 4개의 숫자가 있을 것
즉, 현재 숫자에서 다음의 4개의 문자가 숫자일 경우에만 *
로 교체하는 정규식이다.
// 다른 사람의 풀이3
function solution3(s){
var result = "*".repeat(s.length - 4) + s.slice(-4);
return result;
}
마지막-4 만큼 *
이 반복된 문자열 result를 만들고 거기에 원본 전화 번호의 마지막 4글자를 갖다 붙인것이다.
// 다른 사람의 풀이4
const solution4 = n => [...n].fill("*",0,n.length-4).join("")
[...n] = 문자열을 배열로 바꾼다.
.fill("",0,n.length-4) = 처음부터 마지막 4글자앞까지를 ``로 바꾼다.
.join("") = 배열을 문자열로 다시 바꾼다.
async function runSolutionWithTiming(solutionFn, number1, number2) {
const startTime = new Date();
for (let i = 0; i < 10000000; i++) {
await solutionFn(number1);
await solutionFn(number2);
}
const endTime = new Date();
const executionTime = endTime - startTime;
console.log(`${solutionFn.name} 실행 시간: ${executionTime}ms`);
}
async function main() {
const number1 = "102316854653";
const number2 = "132156789632327";
await runSolutionWithTiming(solution0, number1, number2);
await runSolutionWithTiming(solution1, number1, number2);
await runSolutionWithTiming(solution2, number1, number2);
await runSolutionWithTiming(solution3, number1, number2);
await runSolutionWithTiming(solution4, number1, number2);
}
오늘은 숫자를 두개 넣어서 만들어봤다.
원래는 숫자로 넣었지만 substring에서 오류가 뜨기 때문에 문자열 형태로 넣었다.
실행전에 예상을 해보자면 풀이 4가 제일 느릴것 같다.
실제로 돌려보니 3 > 1 > 0 > 4 > 2 순으로 빨랐다.
정규식이라는것이 보기에는 간단해보이는데 실제로는 많이 느린 것이라는 것을 알게 되었다.
4번의 경우 문자열을 배열로, 다시 배열을 문자열로 변환하기 때문에 느릴것이라고 판단했는데 그대로 들어맞았다.
나의 풀이와 1번은 거의 비슷한 느낌이어서 비슷할줄 알았는데 실제로는 나의 풀이가 1.7배 느렸다.
혹시나해서 for문을 while문으로 바꾸었지만 유의미한 속도 차이는 없었다. 즉, 나와 1번 풀이의 속도 차이는 for문이냐 while문이냐의 차이가 아니라 숫자나 문자를 배열로 바꾸는 과정에 나오는 것이다.
for 문을 유지하면서 데이터 타입 변화를 없애니 비슷한 시간이 나왔다.
예전의 TIL에서는 정규식이 가장 빨랐다. 그래서 정규식을 활용한 2번이 이번에도 느릴 것이라고 판단하였다.
아마도 /m/g
라는 단순한 조건과 /\d(?=\d{4})/g
라는 복잡한 조건의 차이일 수 도 있고 또는 replace 가 원인일 수 도 있다.
0번을 replace로 바꾸니 오히려 가장 빠른 속도가 나와버렸다
이것으로 replace는 오히려 빠른 방식이며, 오히려 복잡한 정규식으로 인해서 더 느려졌다고 판단할 수 있다.
둘의 공통점은 사용자가 로그인을 했을 때 = 이미 인증이 끝났을 때, 인가를 어떻게 할 것인가에 대한 기술입니다.
세션 : 인증 정보를 서버의 session에 담고 클라이언트는 session ID를 발급받아 사용한다.
토큰 : 인증 정보를 클라이언트에 저장한다.