arr = [ 1, 2, 3, 4, 2 ]
arr.indexOf(2) // 1 , 숫자 '2'를 찾아줘
arr.indexOf(2,3) // 4, 숫자 '2'를 3번째 인덱스부터 찾아줘~
arr.lastIndexOf(2) // 4, 뒤에서부터 숫자 '2'의 인덱스 값을 찾아줘
arr.lastIndexOf(2,3) // 1, 3번째 인덱스부터 숫자 '2'의 인덱스 값을 찾아줘
arr = [1, 2, 2, 2, 3, 3, 4, 4]
arr.indexOf(2) // 1
arr.lastIndexOf(2) // 3
arr.slice(1,4) // [2,2,2]
arr.slice(
arr.indexOf(3),
arr.lastIndexOf(3)+1
) // [3,3]
String.prototype.lastIndexOf() - JavaScript | MDN
// 실패율을 구하는 코드를 완성하라.
// 실패율은 다음과 같이 정의한다.
// 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
//전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열
// stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로
// 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.
function solution(N, stages) {
// 모든 스테이지의 번호를 오름차순으로 정렬
stages.sort( ( a,b )=> a-b )
const infos = []
for (let i = 1; i <= N; i++){
infos.push({
stage: i, // 현재 스테이지의 번호
users : 0, // 클리어하지 못한(플레이 중인) 유저의 수
fail: 0 // 스테이지의 실패율을 저장
})
}
//console.log(infos)
let allUsers = stages.length; // 모든 유저의 수(초기값)
for (let i = 0; i <stages.length ; i++){
if( infos[ stages[i]-1 ] ){
infos[ stages[i]-1].users++
// console.log(infos,stages[i])
// 현재 스테이지의 번호와 다음 스테이지의 번호가 동일하지 않다면
// === 현재 스테이지의 유저의 합산이 완료되는 시점
if( stages[i] !== stages[i+1] ){
const fail = infos[ stages[i] -1 ].users / allUsers
allUsers -= infos [ stages[i] -1].users
infos[ stages[i]-1 ].fail = fail
}
}
}
return infos.sort((a,b) =>{
return b.fail -a.fail
}).map(el=> el.stage)
}
// map()을 이용한 풀이
function solution(N, stages) {
stages.sort( ( a,b ) => a-b )
let allUsers = stages.length
const answer = new Array(N).fill(1).map((num,i) =>{
const stage = num + i
const arr = stages.slice(
stages.indexOf( stage ),
stages.lastIndexOf(stage)+1
)
const fail = arr.length / allUsers
allUsers -=arr.length
return {stage, fail}
}).sort((a,b) => {
return b.fail - a.fail
}).map(el => el.stage)
return answer
}
[x] 네이버 로그인 연동
[x] 카카오 로그인 연동
[x] 소셜 로그인 API 통합
// src/commons/auth/jwt-social-naver.strategy.ts
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport'
**import { Strategy } from "passport-naver-v2"**
@Injectable()
export class **JwtNaverStrategy** extends PassportStrategy( Strategy, '**naver**') {
// 네이버에서 인증 및 검증이 모두 되기 때문에 클라이언트 아이디 입력하기
constructor(){
super ({
**clientID: '-',
clientSecret: '-',
callbackURL: '<http://localhost:3000/login/naver>',**
})
}
// 2. 검증 완료 시 validate 실행, accessToken/refreshToken/profile 받아온다~
validate( accessToken: string, refreshToken: string, profile: any ){
return {
email_user: profile.email,
password: "qwer1234",
nickname_user: profile.nickname,
birth_user: "2020-03-15",
}
}
}
// src/apis/auth/auth.controller.ts
...
// 로그인 사이트 (/login/naver)
**@Get('/login/naver')
@UseGuards(AuthGuard('naver'))**
async loginNaver(
@Req() req: Request & IOAuthUser,
@Res() res: Response,
) {
let user = await this.userService.findOne({
email_user : req.user.email_user
})
if(!user){
user = await this.userService.create({
email_user: req.user.email_user,
hashedPassword: req.user.password,
nickname_user: req.user.nickname_user,
birth_user: req.user.birth_user,
})
}
this.authService.setRefreshToken({ user, res })
res.redirect(
"<http://localhost:5500/homework/main-project/frontend/login/index.html>"
)
}
...