항해 99 5기 TIL_45
▶ 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
[백준][Node.js] 2864번 : 5와 6의 차이
Algorithm - 5와 6의 차이 - 문제 상근이는 2863번에서 표를 너무 열심히 돌린 나머지 5와 6을 헷갈리기 시작했다. 상근이가 숫자 5를 볼 때, 5로 볼 때도 있지만, 6으로 잘못 볼 수도 있고, 6을 볼 때는, 6
onelight-stay.tistory.com