20210106-TIL

나영원·2021년 1월 7일
0

T.I.L.

목록 보기
105/145
post-custom-banner

오늘 공부할 내용

  • 오전 알고리즘 문제풀이
  • 오후 JPA 수업 & 운영체제/네트워크 복습
  • 저녁 spring 수업
  • TiL 정리 및 Git & 블로그 업데이트

오늘 공부한 것 & 배운 내용

알고리즘 문제풀이

모의고사

  • 오전시간 내내 문제 풀이를 했는데 배열의 값을 비교해서 출력해주는 작업에서 막혀서 풀어낼수가 없었다.

    • 시간은 오래들고 결과는 없어서 실망스러웠다..

    • 풀이

      class Solution {
          public int[] solution(int[] answers) {
      
              int[] student1 = {1,2,3,4,5};
              int[] student2 = {2,1,2,3,2,4,2,5};
              int[] student3 = {3,3,1,1,2,2,4,4,5,5};
      
              int[][] students = {student1, student2, student3};
      
              int[] scores  = new int[3];
      
              for (int i = 0; i < answers.length ; i++) {
                  for (int j = 0; j < scores.length; j++) {
                      if(answers[i] == students[j][(i % students[j].length)]) {
                          scores[j]++;
                      }
                  }
              }
      
              int maxNum = 0;
              int winnerNum = 0;
              for (int i = 0; i < scores.length ; i++) {
                  if(scores[i] > maxNum ) {
                      maxNum = scores[i];
                      winnerNum =1;
                  }else if(scores[i] == maxNum){
                      winnerNum++;
                  }
              }
      
              int[] answer = new int[winnerNum];
              int index = 0;
              for (int i = 0; i <scores.length ; i++) {
                  if (scores[i]==maxNum) {
                      answer[index++] = i+1;
                  }
      
              }
              return answer;
          }
      }
  • 스프링 복습 이후에 시간을 더 투자해서 풀이를 하다가 해결이 안되서 동료에게 도움을 받아서 풀이를 완성할 수 있었다
  • 내가 처음 풀었던 방법은 score배열을 복사해서 내림차순으로 정렬한 sortedScore을 만들어 2개의 배열을 비교해서 값을 넣는 것이었는데 그렇게 할필요 가 없었다
    • 위에 방식처럼 score을 이용해 maxNum과 winnerNum을 구할 수 있었다
  • 또한 maxNum과 비교하는 과정에서 배열에 인덱스와 for문에 i가 맞지않아 리스트 구현해야 했는데 index 변수를 따로 하나만 선언해주면 간단히 해결되는 문제였다.
  • 문제를 푸는 동안 2가지 실수를 하였다
    • 첫번째 실수는 문제를 제대로 읽지 않고 테스트 케이스만 살펴봐서 최종적으로 가장 높은 점수를 맞은 사람을 뽑는건데 순서대로 넣는것이라고 해석하고 있었다..
    • 채점하는 과정에서 students[j].length를 넣어야 하는 부분에서 student1.length로 되어있어서 풀이과정이 맞았음에도 불구하고 테스트를 통과하지 못하고 있었다..

스프링 day6 복습

  • Isolation이 필요한 이유 (추가정리)

    • 격리성이 수준이 낮으면 발생할 수있는 문제
      • Dirty Read
        • 다른 트랜잭션에 의해 수정됬지만 아직 커밋되지 않은 데이터를 읽는 것을 말한다. 변경 후 아직 커밋되지 않은 값을 읽었는데 변겨을 가한 트랜젹신이 최종적으로 롤백된다면 그 값을 읽은 트랜잭션은 비일관된 상태에 놓이게 된다.
      • Non-Repeatable Read
        • 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데 그 사이에 다른 트랜잭션이 값을 수정 삭제하는 바람에 두 쿼리 결과가 다르게 나타나는 현상을 말한다
      • Phantom Read
        • 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 첫 번째 쿼리에서 없던 유령(Phantom)레코드가 두 번째 쿼리에서 나타나는 현상을 말한다.
      • 참고 자료 ; http://www.dbguide.net/db.db?cmd=view&boardUid=148216&boardConfigUid=9&boardIdx=138&boardStep=1
  • 질문사항 정리

    • Transaction을 Javax로 임포트한뒤에 propagation을 하려니 안되서 강의를 다시보니 TxType으로 뜨던데 이게 spring Transaction에 propagation과 같은건가요?

      • 같은게 맞고 Javax가 더 표준에 가까운 형식이지만 어느걸 써도 무방하다
    • MANDATORY는 트랜잭션이 필수인데 자기자신이 트랜잭션을 생성하는게 아닌 부모 트랜잭션을 사용한다는점에서 REQUIED와 다른건가요?

      • MANDATORY는 트랜잭션이 없으면 오류가 나고 부모 트랜잭션이 있으면 부모 트랜잭션으로 실행된다
      • REQUIRED는 트랜잭션이 없으면 새로 만들고 부모 트랜잭션이 있으면 부모트랜잭션을 사용한다
      • NULL일경우 new를 하느냐 exception을 내느냐 차이로 보면 될 것 같다
    • isolation 중에 repeatable_read와 serializable 설명하실때 read나 read&write lock을 건다고하셨는데 lock을 거는게 db에서 하나의 트랜잭션이 진행되고있으면 다른 트랜잭션이 접근하지 못하게 하는건가요?

      • 맞다 락을 건다는것은 해당 트랜잭션이 독점적이고 베타적인 권한을 갖는것을 말한다
    • 락이 걸릴때는 컬럼 단위로 걸리는건가요? lock이 걸리는게 어떻게 걸리는지 궁금합니다

      • 테이블락, 컬럼락, 레코드락 다 있고 쿼리마다 조금씩 다르다. 보통 위의 isolation을 사용했을 대는 레코드(row)락을 걸게 된다
    • 또한 lock을 걸린동안 접근하려고 했던 트랜잭션인 진행중이던 트랜잭션이 끝날때까지 대기했다가 해당 트랜잭션을 실행하게 되는건지 아니면 트랜잭션이 실행되지 않는지 궁금합니다

      • 기다렸다가 실행된다. 그래서 대용량 트래픽을 받을 때는 llock을 최소한으로 사용하는 것이 필요하고 lock이 없어서 생기는 문제들을 소프트웨어적으로 풀어가는게 실력이고 요즘 추세이다
    • Entity 설명해주실때 ddl에 사용되는 어노테이션은 이미 서비스가 존재하는 경우가 많기 때문에 잘사용하지 않으신다고 하셨는데
      만약 서비스를 처음 개발해서 디비를 생성해야 되는경우는 보통 어떤 방식으로 생성해주게 되나요??( 실제로 할경우는 별로없겠지만 궁금합니다~)

      • 서비스를 처음 개발하는 경우에는 쿼리를 직접 만드렁서 DB에서 실행하게 된다
        • DB권한을 개발자가 못가지느 경우가 많아 쿼리를 추출해서 실행해야 되고 또 하나는 jpa에서 자동으로 만들어진 쿼리는 실제 DDL 쿼리와 약간 차이가 있기 때문이다
        • 또한 varchar(255) -> varchr(30)같은 컨스트레인을 세세하게 걸기위해서도 그렇게 한다

내일 공부할 내용

  • 오전 알고리즘 문제풀이
  • 오후 운영체제/네트워크 수업
  • 저녁 git/github 수업
  • TiL 정리 및 Git & 블로그 업데이트
profile
배우는 개발 일기
post-custom-banner

0개의 댓글