전체 글

전체 글

    BFS 기본 틀

    BFS는 다차원 배열에서 각 칸을 방문할 때 너비를 우선으로 방문하는 알고리즘이다. BFS에 대해서는 자료구조와 알고리즘 시간에 배웠으므로, 개념에 대한 자세한 정리는 따로 하지 않겠다. BFS를 구현하는 기본 틀은 아래와 같다. 반복 숙달을 통하여 자기것으로 만드는 것이 좋다. #define X first #define Y second // pair에서 first, second를 줄여서 쓰기 위해서 사용 int board[502][502] bool vis[502][502]; // 해당 칸을 방문했는지 여부를 저장 int dx[4] = {1,0,-1,0}; int dy[4] = {0,1,0,-1}; // 상하좌우 네 방향을 의미 int main(void){ queue q; vis[0][0] = 1; //..

    [C++] BOJ 2493 / stack 과 pair의 사용

    https://www.acmicpc.net/problem/2493 2493번: 탑 첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1 www.acmicpc.net 스택을 사용하는 문제를 풀던 중 만난 문제였다. PS에 대한 경험이 적다보니, 손 가는 대로 코드를 짰고 그 결과 시간초과가 발생하였다. 처음 구현했던 방법은 Stack 3개를 써서 구현한 방식이었다. 시간을 단축하기 위해서 타워의 높이를 일괄적으로 스택에 넣고 POP 하며 계산하는 것이 아닌, 높이를 하나씩 push 받으면서 계산을 해야한다는 생각이 들었다. 첫 번째 시도에서는 놓쳤던 이 문제..

    node.js 에서 middleware Skip 하는 방법

    프로젝트를 진행하면서, 경우에 따라 푸시알림(FCM)을 발생시켜야 했다. 이는 전부 미들웨어로 구현하였고, 푸시알림을 발생 시키지 않을 경우에는 관련 미들웨어를 건너 뛰게 하였다. 해당 부분을 까먹기 전에 기록으로 남긴다. 위의 라우터에 대해 간단하게 차례로 설명하자면 아래와 같다. 1)setCurrentUser : JWT를 decode 하여 사용자id 추출 2)createPooData : 라즈베리파이로 부터 받아온 대변의 색상 값을 DB에 Create 3)searchFcmKey : App으로 부터 받아서 DB에 저장해 놓은 FCM Key값 조회 4)createPushAlarm : 푸시알림 발생 1, 2번 미들웨어는 항상 사용돼서 건너 뛸 필요가 없지만, 3번과 4번 미들웨어는 경우에 따라 사용하지 않기..

    갑자기 궁금해져서 정리하는 js 변수 선언 방식

    프로젝트를 진행 하면서 여러 자료를 참고하는데, 문득 const / var / let 의 차이를 알고 싶어져서 정리하게 되었다. 1. var var은 큰 단점을 가진다. var test = 'god' console.log(test) // god var test = 'sang' console.log(test) // sang 같은 이름의 변수를 다시 선언해도 각각 다른 값이 출력된다. 유연한 변수 선언으로 간단한 테스트에는 편리 할 수 있지만, 큰 프로젝트 처럼 코드량이 많아 질 경우 가독성이 떨어진다. 이를 보완하기 위해 추가 된 변수 선언 방식이 'let' 과 'const' 이다. 2. let, const 위 var의 코드에서 변수 선언 방식만 바꾸게 되면 아래와 같다. let test = 'god' c..

    deepFake Detection - 03 (faceForensic++ Colab으로 실행)

    1. FaceForensics++ Github에서 clone을 Colab에서 받아온다. 앞에 " ! " 를 붙이면, 명령어로 실행된다. git clone 명령어를 실행하여서 코드를 받아온다. 해당 코드는 연동 된 구글 드라이브로 들어가게 된다. 2. cd 명령어를 통해서 코드가 있는 곳으로 이동한다. 파일 경로는 사용자 마다 다르니, 각자 상황에 맞게 적용해야 한다. 3. 제공되는 requirements.txt를 사용하여, 필요 라이브러리를 설치한다 2021년 5월 8일 기준으로 FaceForensic++ 에서 제공하는 requirements.txt 를 그대로 사용하면 에러가 난다. 캡쳐는 하지 못했지만, 이미 지원이 끝난 버전들이 많아서 그렇다. 그런 경우에는 위 처럼 구글에 검색하여 최신 버전을 찾고..

    deepFake Detection - 02 (Google Colab 환경 설정)

    프로젝트를 진행하기 위해서는 학습을 시켜야 하는데, 주제가 deepFake 이다 보니, 데이터셋이 동영상이고 용량이 크다. 그렇기 때문에 GPU가 없는 노트북으로는 불가능 할 것이라 생각이 들어서, 찾아보니 Colab(코랩) 이라는 것을 알게되었다. Colob(코랩)은 클라우드 기반의 무료 Jupyter 노트북 개발 환경이다. 공짜이며, 성능이 좋고 빠르다. 단점으로는 최대 세션 유지시간이 12시간이고, 90분 동안 사용하지 않으면 메세지가 뜨면서 그 메세지를 확인하지 않았을 경우에 세션이 종료된다. (90분 마다 확인해야하는 것을 생략하기 위해 여러 편법들이 있다. 따로 포스팅 하지 않고 링크만 첨부하겠다.) 1. Colab 설치(?) 먼저 구글 드라이브에 접속하여, 우클릭 > 더보기 > 연결할 앱 더..

    deepFake Detection - 01(주제 선정 및 참고 자료)

    이번 학기 중, 프로젝트로 deepFake detection에 대한 모델을 개발, 확장 시키기로 하였다. 딥러닝에 대한 기초 지식이 없는 상태였기 때문에, 관련 자료를 찾아보던 중, FaceForensic++ 라는 논문을 찾게되었고, 이를 참고하여 프로젝트를 진행하기로 하였다. FaceForensic++ 논문 링크 : openaccess.thecvf.com/content_ICCV_2019/papers/Rossler_FaceForensics_Learning_to_Detect_Manipulated_Facial_Images_ICCV_2019_paper.pdf FaceForensic++ GitHub 링크: github.com/ondyari/FaceForensics ondyari/FaceForensics Gith..

    MongoDB를 사용하여 android Pagination 구현

    현재 진행중인 프로젝트는 SNS기반의 앱 이라서 NoSQL을 사용하였고, 메인피드에서 게시글들을 보여주기 위해서 pagination을 사용해야했다. 오늘 작업한 내용을 까먹지 않기 위해 본 글을 작성한다. 먼저 서버(node.js) 코드부터 설명하겠다. router.get('/:page', async (req, res, next) => { const offset = 6; const posts = await Post.find({}, {}) .sort({ update_time: -1, }) .skip(req.params.page * offset) .limit(offset); const retval = { data: posts, }; res.status(200).send(retval); }); 해당하는 API..

    팀 프로젝트를 위한 github organization 설정

    organizaion은 여러명이 프로젝트를 할 때 유용하다. 1. github 로그인 후, 우측 상단 "+" > "New organization" 2. 나머지 설정은 직관적으로 되어 있으므로, 항목들을 읽어가면서 프로젝트에 맞게 선택해주면 된다. 3. 본인 같은 경우에는, 팀 프로젝트가 중간까지 진행되었을 때, organization을 알게 되어서 각자 작업하던 repository를 organization으로 옮겨줘야 했다. 4. 만든 organizaion으로 들어간 후, 우측 상단 "+" > "Import repository" 를 하여 Import를 진행하면 된다. 5. 미리 로컬과 연결되어있던 remote를 수정해준다 - git remote add url

    Sequelize 사용 기록(CRUD/Pagination) - 03

    오늘은 진행하는 프로젝트에서 데이터를 조회하는 부분을 구현하였다. dog_poo 테이블에서 최신순으로 정렬한 후 "RGB"값을 두개 씩 보내주는 것이 목표였다. 어떻게 구현해야 할지 찾아보던 중 "pagination" 이라는 것이 있어서 사용하였고, 이를 기록으로 남긴다. const readPooData = async (req, res, next) => { const pooData = req.query; const Op = Sequelize.Op; var startDate = new Date(pooData.date); var endDate = new Date(pooData.date); endDate.setDate(endDate.getDate()+1); try { const result = await db..