-
항해 99 5기 TIL_45항해 99 2022. 2. 24. 02:02
▶ Today I Learned
<알고리즘>[5와 6의 차이]
소요 시간: 30분
해결 여부: 해결
/*5와 6의 차이*/ // 최댓값인 경우 5를 6으로 변환 // 최솟값인 경우 6을 5로 변환 let num1 = 111 let num2 = 25 let min = 0 let max = 0 // 최댓값 구하기 // 반복문의 길이를 저렇게 짜는 이유는 두 수의 길이가 다를 수 있기 때문! // 둘 중 무조건 큰 수를 기준으로 한다면 문제 없이 첫 인덱스부터 끝 인덱스까지 돌 수 있음 let arr1 = (num1+ "").split('') let arr2 = (num2+ "").split('') console.log(arr1) console.log(arr2) let i = 0 while (i < (Math.max(num1, num2) + "").length) { if (arr1[i] === '5') arr1[i] = '6' if (arr2[i] === '5') arr2[i] = '6' i++ } max = arr1.join('')/1 + arr2.join('')/1 i = 0 // 최솟값 구하기 while (i < (Math.max(num1, num2) + "").length) { if (arr1[i] === '6') arr1[i] = '5' if (arr2[i] === '6') arr2[i] = '5' i++ } min = arr1.join('')/1 + arr2.join('')/1 console.log(max) console.log(min) let result = min + " " + max console.log(result)
문제 설명은 초반에 이해하기가 조금 난해했다.
하지만 로직 자체는 단순했고, 눈여겨 볼만한 것은 반복문을 돌릴 때가 평소와 달리 최댓값인 숫자의 길이를 기준으로 해야한다는
점이었다.
조금 더 어려운 그리디 문제도 풀어봐야지 :)
<클론 코딩>
[카카오 로그인]
// 로그인 정보 저장 + 토큰 발급 router.post("/users/loginKakao", async (req, res) => { const { email, nickname } = req.body; const user = new User({ email, nickname }); await user.save(); res.send({ result: true, token: jwt.sign({ email: user.email }, JWT_SECRET_KEY), }); }); module.exports = router;
해당 코드에서 보이는 것 처럼 카카오에서 건네받은 아이디와 닉네임을 넘겨주어 우리 쪽에서 새로운 토큰을 생성해준다.
하지만 오류가 발생했다.
Error: data and salt arguments required
카카오 로그인 시에는 password라는 data를 전달해주지 않기 때문에 Error: data and salt arguments required 가 발생하는 것이다.
// 이전의 코드, 카카오 로그인 시 password라는 data가 없기 때문에 Error: data and salt arguments required 가 발생한다. UserSchema.pre("save", function (next) { let user = this; bcrypt.genSalt(10, (err, salt) => { if (err) return next(err); bcrypt.hash(user.password, salt, (err, hash) => { if (err) return next(err); user.password = hash; next(); }); }); });
그래서 위의 코드를 다음과 같이 조건문으로 나누어 보았다.
UserSchema.pre("save", function (next) { let user = this; if (user.password) { // 저장할 때 user로 받아오는 값 중 password가 있는 경우만 실행! 즉, 카카오는 받아오는 비밀번호가 없으므로 실행되지 않음 bcrypt.genSalt(10, (err, salt) => { if (err) return next(err); bcrypt.hash(user.password, salt, (err, hash) => { if (err) return next(err); user.password = hash; }); }); } next(); });
이렇게 되면 기존 회원 가입 방식에서는 패스워드를 받으므로 비밀번호를 bcrypt화 하여 넘겨줄 수 있고,
카카오 로그인 시에도 비밀번호 없이 넘기는 방식으로 잘 작동시킬 수 있다.
▶ 느낀 점
오늘도 간간히 발생했던 문제들의 코드를 수정했다. 수정하고 나서 테스트를 하였을 때 문제없이 작동하거나 프론트 분들에게
'기능 잘 돼요!' 라는 말을 들을 때 마다 정말 뿌듯했다.
여전히 많이 배워야할 실력이지만 이렇게 조금씩은 성장해가는 것 같다.
실전 프로젝트가 코 앞까지 다가왔으니 끝까지 최선을 다해 문제를 해결하고 지식을 쌓아가도록 하자!
유후~!
▶ 공부 시 참고 링크들
https://onelight-stay.tistory.com/479
'항해 99' 카테고리의 다른 글
항해 99 5기 TIL_47 (0) 2022.02.26 항해 99 5기 TIL_46 (0) 2022.02.25 항해 99 5기 TIL_44 (0) 2022.02.23 항해 99 5기 TIL_43 (0) 2022.02.22 항해 99 5기 WIL_6 (0) 2022.02.20