항해 99

항해 99 5기 TIL_45

Dream Herb 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

 

[백준][Node.js] 2864번 : 5와 6의 차이

Algorithm - 5와 6의 차이 - 문제 상근이는 2863번에서 표를 너무 열심히 돌린 나머지 5와 6을 헷갈리기 시작했다. 상근이가 숫자 5를 볼 때, 5로 볼 때도 있지만, 6으로 잘못 볼 수도 있고, 6을 볼 때는, 6

onelight-stay.tistory.com