ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 항해 99 5기 TIL_64
    항해 99 2022. 3. 15. 00:25

    ▶ Today I Learned

     

    <알고리즘>

     

    [신나는 함수 실행]

     

    소요시간: 1시간 40분 + 1시간 30분

    해결여부: 해결

    https://www.acmicpc.net/problem/9184

    유형: 다이나믹 프로그래밍, 재귀

     

    해설을 참조했고 해설을 드디어 이해했다.

     

    const fs = require('fs');
    const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
    input.pop(); // 해당 문제에서 마지막 -1 -1 -1은 필요없다.
    const factors = input.map(v=>v.split(' ').map(v=>+v));
    let memo = []; // 메모라는 배열을 따로 만들어준 이유는 임의의 dp 테이블을 만들기 위해서라고 생각한다.
    
    for(let i =0; i<=101; i++){
        memo[i]=[];
        for(let j =0; j<=101; j++){ // 문제에서 -50 <= a,b,c <= 50 이기 때문에  정수의 갯수로 치면 101이다.
    		// 여기서 모든 테이블 값을 0으로 채우면 자연스럽게 필요없는 0의 축 (테이블의 시작점)들은 사라진다. dp에서는 보통 시작점을 0이 아닌 1로 잡는다.
            memo[i][j]=[];
            for(let k=0; k<=101; k++){
                memo[i][j][k]=0;
            }
        }
    }
    
    factors.forEach(v=>{
        const answer = w(v[0]+50,v[1]+50,v[2]+50)
         // 여기서 각각에 50씩을 더해주는 이유는 실제 입력 값 범위는 -50에서 시작하는데 반해 memo값은 0부터 시작하기 때문에 50이라는 간극을 좁혀주는 것이다.
        console.log(`w(${v[0]}, ${v[1]}, ${v[2]}) = ${answer}`)
    })
    
    
    function w(a,b,c){
        if(memo[a][b][c]!=0){
            return memo[a][b][c];
            // 처음에 모든 값을 0으로 채웠다. 하지만 값이 0이 아니라는 건 이미 밑의 식들에 의해 최종 값이 나왔다는 뜻이므로 굳이 연산을 할 필요없이 해당 값만 출력해주는 것이다.
        }else{
            if (a <= 50 || b <= 50 || c <= 50){
                return 1;
            }
            
            else if(a > 70 || b > 70 || c > 70) 
            return w(70, 70, 70)
            
            else if (a < b && b < c ){
                memo[a][b][c]=w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c);
    // 이 과정이나 아래 과정에 의해 결국은 1을 리턴하는 구간으로 가게된다.
    // 이때 해당 1을 더하거나 뺴는 것으로 최종 값이 나오게 된다. 우리는 이를 결과에 반영해주기만 하면 된다.
            }
            
            else {
                memo[a][b][c]=w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1);
            }
        }
        return memo[a][b][c];
    }

    이해하는 데 꽤 오래 걸렸지만 결국엔 이해해냈다!

    동적 프로그래밍 문제는 이제 처음보다 조금 더 감이 잡히는 것 같다

    이렇게 성장해가는거지~!

    뿌듯쓰 :)

     

    출처:

    https://lhoiktiv.tistory.com/151

     

    <CS>

     

    [ORM]

     

    Object Relational Mapping, 객체-관계 매핑의 줄임말.

    이를 풀어서 설명하면 OOP(Object Oriented Programming)에서 쓰이는 객체라는 개념을 구현한 클래스와

    RDB (Relational DataBase)에서 쓰이는 데이터인 테이블을 자동으로 매핑(연결)하는 것을 의미한다.

    그러나 클래스와 테이블은 서로가 기존부터 호환가능성을 두고 만들어진 것이 아니기 때문에 불일치가 발생한다.

    이를 ORM을 통해 객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하여 불일치를 해결한다. 따라서 ORM을 이용하면

    따로 SQL문을 짤 필요없이 객체를 통해 간접적으로 데이터베이스를 조작할 수 있게 된다.

     

    장점

     

    - 클래스의 메서드를 통해 DB를 조작할 수 있어 개발자가 객체 모델만 이용해서 프로그래밍을 하는 데 집중할 수 있음

    (DBMS에 대한 종속성 하락)

    - 부수적인 코드가 줄어들며 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성이 높아짐

    - 재활용 가능하며 ERD를 보는 의존도가 줄어듬

     

    단점

     

    - ORM으로 모든 것을 해결할 수는 없음, 프로젝트의 복잡성이 커질수록 부족한 설계로 인해 잘못 구현될 수 있음

    - 객체 - 관계 간의 불일치가 생길 수 있음

     

    cf) 객체-관계 간의 불일치 발생을 불러 일으키는 특성

     

    세분성 (Granularity)

    경우에 따라서 DB안에 있는 테이블 수보다 더 많은 클래스를 가진 모델이 생길 수 있음

     

    상속성(Inheritance)

    RDBMS는 객체지향 프로그래밍 언어의 특징인 상속 개념이 없다.

     

    일치(Identity)

    RDBMS는 기본키를 이용하여 동일성을 정의함, 그러나 자바같은 경우 객체 식별(a==b)과

    객체 동일성(a.equals(b))을 모두 정의함

     

    연관성(Associations)

    객체지향 언어는 방향성이 있는 객체의 참조(reference)를 사용하여 연관성을 나타내지만

    RDBMS는 방향성이 없는 외래키를 이용해서 나타냄

     

    탐색(Navigation)

     

    자바와 RDBMS에서 객체를 접근하는 방법이 근본적으로 다름,

    자바는 그래프형태로 하나의 연결에서 다른 연결로 이동하며 탐색함,

    그러나 RDBMS에서는 일반적으로 SQL문을 최소화하고 JOIN을 통해 여러 entity를 로드하고

    원하는 대상 entity를 선택하는 방식으로 탐색함

     

    ORM 프레임워크 종류

    자바의 Hibernate, Node.js의 Sequelize, python의 Django ORM이 있다.

     

    출처:

    https://geonlee.tistory.com/207

    https://gmlwjd9405.github.io/2019/02/01/orm.html

     

     

    <실전프로젝트>

     

    [뱃지 저장]

     

    '자바스크립트 뱃지 구현'이라고 대략적인 범주로 키워드만 넣어 검색하니 다음과 같이 자바로 뱃지 수집기능을

    구현한 코드를 발견하게 되었다.

    이분의 경우 새벽 3시라는 정해진 시간에 뱃지 지급 기준을 충족하는지 확인하고 충족할 경우 뱃지를

    일괄 지급하는 방법을 쓰셨다.

    그 내용은 아래와 같다.

     

    batch scheduler

    https://hayeon17kim.github.io/posts/devil-badge/

     

    물론 이것도 하나의 좋은 방법이지만 우리팀의 경우  특정시간에 지급하기보단 조건을 충족하는 순간 바로 뱃지가

    지급되도록 하는 것이 적절할 것이다. 따라서 batch를 이용하는 것은 차선책으로 두기로 한다.

     

    이벤트성 배치라고 특정 기준을 충족하면 뱃지가 지급되도록하는 방법도 있어보이는 데 이는 더 조사가 필요하다.

     

    그러지말고 출석체크나 선착순 100명같은 각각의 기준에 해당하는 이벤트마다 접속해있는 유저의 ID가 그 기준을 충족할 경우

    해당 유저의 아이디를 뱃지테이블 내부 칼럼에 넣는 것은 어떨까?

    둘다 나쁘지 않은 방법 같지만 후자는 각각의 이벤트들을 특정 한 페이지에 모을 수 있을지가 의문이었다.

     

    뭐든 더 찾아보고 구현해보아야 하는 것이니 일단 구현해보아야겠다.

     

    ▶ 느낀 점

     

    팀 내 잘하시는 분들에 비해 속도가 더딘 것 같아 팀원 분들에게 폐를 끼치면 어쩌지라는 생각을 하게 될 때가 있었다.

    대체로 긍정적이고 열정적인 편인 나에게도 좌절감이나 자괴감이 드는 순간, 지치는 순간은 있기 마련이다.

    하지만 그분들과 비교하며 축 처지지는 않았으면 한다.

    그분들은 대체로 나보다 더 오래 공부하신 분들이다.

    팀내 잘하시는 분들이 옆에 있기에 '아, 나는 왜 저렇게 못하지'보단

    '아, 나도 저렇게 잘하기 위해서 오늘도 열심히 해야지'하고 자극받으면 된다.

    스스로 찾아보고도 정말 모르는 것이 생기면 질문도 드리고 의견을 나누면 그분들을 통해 더 많이 배울 수 있다.

    그분들도 사소한 질문이 아닌 깊게 고민한 질문에 대해서 답변해주시다보면 그것 또한 유의미한 공부가 된다.

     

    위와 같이 생각하면서 내가 모른다고 슬퍼하기 보단 해답을 찾아가며 한뼘한뼘 성장하는 자신을 보고 기뻐하면 된다.

    그래서 나는 오늘도 기쁘다.

     

    ▶ 공부 시 참고 링크들

    https://pinocc.tistory.com/89

     

    git rebase 시 conflict 발생

    git rebase 를 수행하는데 conflict 가 발생한 경우에 해결 하는 절차를 적어본다. 우선 S project 라는 가상의 프로젝트에 A~J 까지 10개의 commit 이 있는 master branch 가 있다고 가정한다. E 에 해당하는 com..

    pinocc.tistory.com

     

     

    '항해 99' 카테고리의 다른 글

    항해 99 5기 TIL_66  (0) 2022.03.17
    항해 99 5기 TIL_65  (0) 2022.03.16
    항해 99 5기 TIL_63  (0) 2022.03.13
    항해 99 5기 TIL_62  (0) 2022.03.13
    항해 99 5기 TIL_61  (0) 2022.03.12
Designed by Tistory.