한줄평

시간이 애매하게 남거나 숨돌릴 겸 못 풀었던 알고리즘/SQL 문제들을 푸는 것도 나쁘지 않을 것 같다!

오늘의 삽질

최대 공약수 구현

  • 최대 공약수 알고리즘을 구현하는데.. 최대 공약수의 정의를 헷갈려 약수가 “소수”인 것처럼 생각해 버렸다.

  • 그렇게 소수를 찾아서 최대 공”소수”를 찾는 알고리즘을 만들었다.

  • 그 후 테스트에서 성공률이 50%가 나오길래 뭐가 문제인지하고 검색을 하게 되었다..
    => 수정본은 맨 하단에 (약수가 소수가 아니란걸 알아버린 나의 세상은 무너졌다..)

function solution(n, m) {
    //소수 = 1과 자신을 제외한 다른수로 나눠지지 않는 수
    let prime = [1];
    let prime_n = [];
    let prime_m = [];
    // 공약?수
    let equal_prime = [];
    // 더 작은 수 구하기
    let min = Math.min(n,m);
    // 답 제출
    let answer = [];
    
    //작은 수 기준 공통 소수 구하기
    for (let v1 = 1;v1 <= min;v1++){
        // v1가 자신의 아래에 있는 수(v2)로 나눠질 때
        for (let v2 = 1;v2 <= v1 ;v2++){
            if (v1 % v2 === 0){
                // v2가 1이 아닌 소수로 알맞게 나눠지지 않으면 소수에 포함시킨다.
                for (let v3 = 0;v3 < prime.length;v3++) {
                    // 1이 아닌 소수로 나눠지면 무효
                    if (v2 % prime[v3] === 0 && prime[v3] !== 1) {
                        break;
                    // prime 이 기본상태가 아니며 소수 값이 1일 경우는 무시한다
                    } else if (prime.length > 1 && prime[v3] === 1) {
                        continue;
                    // 중복값을 제외하며 마지막까지 안 나눠진 값을 넣는다.
                    } else if (!prime.includes(v2) && prime[v3] === prime[prime.length - 1]) {
                        prime.push(v2);
                    }
                }
            }
        }
    }
    
    //각 숫자를 소인수분해하기
    for (let i =0;i < prime.length;i++) {
        if(n % prime[i] === 0) {
            //n이 소수로 나눠지면 소인수분해 성공! 및 저장
            prime_n.push(prime[i]);   
        }
        if(m % prime[i] === 0) {
            prime_m.push(prime[i]);   
        }
    }
    
    //소인수분해된 배열들의 교집합 구하기
    equal_prime = prime_n.filter(x => prime_m.includes(x));

    // 구조분해할당으로 문자를 숫자로 인식시켜 최대 공약수 제출
    answer.push(Math.max(...equal_prime));

    return answer;
}

개선점 분석

  • 알고리즘 구현 전 정의들을 확실히 확인하고, 방법들을 정리하며 시작을 해야겠다.

  • Node.js 입문 강의에 실습위주의 내용들을 전부 적거나 정리하기 어려워.. 조금씩 차근차근 올려야 겠다..

지식창고

[Node.js 입문] 강의

Express Router / API 구현

Express의 기능인 Router를 이용해 API를 서버와 연결해보는 예제를 분석할 것이다.

// router의 기본 형태로 API 구현
router.METHOD(PATH, HANDLER);
  • METHOD는 HTTP Method를 뜻하며 대표적 종류로는 get(조회)/post(입력)/delete(삭제) 등등이 있다.

  • PATH는 실제 서버에서 API를 쓰기 위한 경로로 기본경로 + PATH 가 지정된다.

  • HANDLER router의 경로(PATH)로 METHOD가 알맞게 들어오면 실행되는 함수이다.

  • 예제

// ./app.js (메인) 파일
// router 받아오기
import Router from './routes/router.js';
import express from 'express';

const app = express();
// 포트 번호 지정
const PORT = 3000;

// Express에서 req.body에 접근하여, body 데이터를 사용할 수 있도록 설정해주는 미들웨어 2 line
app.use(express.json());
app.use(express.urlencoded({ extended: true }));


// 미들웨어인 [Router]를 기본주소 + /api 로 연결 시 실행하도록 연결
app.use('/api'. [Router]);

// 기본주소인 localhost:3000 로 서버 오픈
app.listen(PORT)


/****** 파일 이동 ******/


// ./routes/router.js 파일
//yarn add express 명령어를 통해 미리 express 패키지를 프로젝트에 포함시킨다
import express from 'express';

// Express.js의 라우터를 생성
const router = express.Router();

router.get('/', (req, res) => {
  return res.json('default url for router.js GET Method');
});
// => localhost:3000/api/ 에 get 요청 시, res(클라이언트에게 응답으로).json(json 형태인)
// 'default url for router.js GET Method' 출력

router.get('/about', (req, res) => {
  return res.json('router.js about PATH');
});
// => localhost:3000/api/about 에 get 요청 시, res(클라이언트에게 응답으로).json(json 형태인)
// 'router.js about PATH' 출력

router.post('/goods', (req, res) => {
    //입력받은 값(req) 에서 값을 가져와 할당하기
    const name = req.body.name;
    const thumbnailUrl = req.body.thumbnailUrl;
    const category = req.body.category;
    const price = req.body.price;
    // 현재 goodsId의 가장 큰 값 + 1
    const goodsId = goods[goods.length - 1].goodsId + 1; 
    // 할당된 값들로 객체 생성
    const goodsItem = {
    goodsId: goodsId,
    name: name,
    thumbnailUrl: thumbnailUrl,
    category: category,
    price: price,
    };

    //goods 라는 배열에 goodsItem 객체 추가 (goods는 맥락상 생략된 객체 배열임)
    goods.push(goodsItem);

    return res //클라이언트에게
        .status(201) // 수신양호 200 + 생성완료 1 상태를 보내고
        .json({ goods: goodsItem }); //json 형태로 입력한 값으로 만든 객체를 보낸다 
});


// router 보내주기
export default router