ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 항해 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

     

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

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

    onelight-stay.tistory.com

     

     

     

     

    '항해 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
Designed by Tistory.