20200105-TIL

나영원·2021년 1월 6일
0

T.I.L.

목록 보기
103/145

오늘 공부할 내용

  • 오전 알고리즘문제 풀이
  • 오후 알고리즘 수업
  • 저녁 스프링심화 복습
  • TiL 정리 및 Git & 블로그 업데이트

오늘 공부한 것 & 배운 내용

알고리즘 문제풀이

소수찾기

  • 풀이

    class Solution {
        public int solution(int n) {
            int answer = 0;
    
            boolean[] array = new boolean[n+1];
            for (int i = 2; i <= n ; i++) {
                array[i] = true;
            }
    
            for (int i = 2; i <= n; i++) {
                if(array[i] == true) {
                    answer++;
                    for (int j = 1; j*i <= n ; j++) {
                            array[i*j] =false;
                    }
                }
            }
    
            return answer;
        }
    }
  • 소수를 효율적으로 찾는법은 스스로 찾을 순 없었고 에라토스테네스의 체라는 방법을 공부한 뒤에 적용하였다

    • 모든수를 하나씩 찾는게 아닌 하나의 소수를 찾으면 범위내에 해당 소수의 배수를 제외해주는 방식으로 연산하는 과정을 줄여주는게 포인트였다
    • 위의 풀이 법을 적용하는 과정도 동료가 array를 boolean으로 하라고 힌트를 줘서 수월하게 풀수 있었다
  • array[i]==true라고 비교하는 부분에서 비교를 ==가 아닌 =으로 해서 계산 오류가 생겨서 찾는데 오래걸렸다.. 비교는 당연히 ==로 하는건데 왜그렇게 써놧는지 모르겠다

    • if문은 왜 작동을 했는지 그것도 궁금하다

수박수박수박

  • 풀이

    class Solution {
        public String solution(int n) {
    
            StringBuilder stringBuilder = new StringBuilder(n);
            for (int i = 0; i < n; i++) {
                if (i % 2 != 0 ){
                    stringBuilder.append("박");
                } else {
                    stringBuilder.append("수");
                }
            }
            return stringBuilder.toString();
        }
    }
    • string 순서상 홀수가 "수"이고 짝수가 "박"이라 그렇게 배치했는데 반대의 결과가 나와서 생각해보니 i가 0부터 시작하니 반대로 적용하는게 맞았다
    • 다른사람 풀이보니 수박을 길이만큼 써놓고 sbustring으로 짤라오는 케이스가 있어서 재밌었다
      • 다른 풀이를 보니 if else문이 아닌 3항연산자로 풀이했는데 이게 더 깔끔하게 풀이가 되는 것 같다

내적

  • 풀이

    class Solution {
        public int solution(int[] a, int[] b) {
            int answer = 0;
    
            for (int i = 0; i < a.length; i++) {
                answer += a[i]*b[i];
            }
    
    
            return answer;
        }
    }
    • 간단하게 풀이할수있는 문제였고 다른사람풀이에도 크게 다른점은 찾지 못하였다

두개뽑아서더하기

  • 풀이

    import java.util.ArrayList;
    import java.util.List;
    
    class Solution {
        public int[] solution(int[] numbers) {
    
    
            List<Integer> list = new ArrayList<>();
            for (int i = 0; i < numbers.length; i++) {
                for (int j = i+1; j < numbers.length; j++) {
                    list.add(numbers[i]+numbers[j]);
                }
            }
            list.sort(Integer::compareTo);
            for (int i = 0; i <list.size()-1 ; i++) {
                if (list.get(i).equals(list.get(i+1))) {
                    list.remove(i);
                    i = -1;
                }
    
            }
            int[] answer = new int[list.size()];
            for (int i = 0; i < list.size(); i++) {
                answer[i] = list.get(i);
    
            }
    
            return answer;
        }
    }
    • 배열을 순차적으로 더해주는 방법이 궁금했는데 2중 반복문에 j=i+1로 해주어서 풀어낼수 있었다
    • 리스트에 중복된 값을 제거하는 더나은 방법이 있는지 궁금하다
      • 먼저 set에 넣어 중복제거하고 그다음에 iterator를 활용해 리스트로 옮겨 담는 방법이 있었다
      • 혹은 stream()을 이용해 set 을 바로 Integer로 변환시키는 방법도 있었다
        • stream을 통해 많은것을 할수있는거 같은데 복습이 필요하다
    • IntegerList를 어떻게 int[]로 바로 변화할수 있는지 알면 좋을 것 같다

완주하지못한선수

  • 풀이

    import java.util.Arrays;
    
    
    class Solution {
        public String solution(String[] participant, String[] completion) {
            String answer = "";
            Arrays.sort(participant);
            Arrays.sort(completion);
    
            for (int i = 0; i < completion.length ; i++) {
                if (!participant[i].equals(completion[i])){
                    answer=participant[i];
                    break;
                }
            }
            if(answer.length()==0){
                answer = participant[participant.length-1];
            }
    
            return answer;
        }
    }
    • 2중 for문을 통해 알고리즘을 구현했을 때는 효율성테스트를 통과하지 못해 어떤방법이 있을까 고민하다가 정렬을 해서 for문 한번으로 비교하자는 마음으로 구현해보았는데 효율성테스트까지 통과하였다

      • 다른 사람의 비슷한 풀이를 보니 answer을 따로 담는대신에 바로 participant[i]를 return해주는 방법이 있었다
        • 이때는 for문에 i를 바깥쪽에 선언해주어 맨마지막에 남은 값이 완주하지 못한 선수르면 return되게 할 수있었다
    • 가장 추천이 많은 풀이는 HashMap을 이용한 풀이로 key값에 pariticpant[] player를 넣고 map에 push할따마다 value를 ++해주고 completion Player를 다시 한번 Hashmap에 넣어주어 이때는 value에 --를 해준다

      • 이후 map에 key값을 가져와 value가 0이 아닌 player찾아 return하여 해결한다

      • 알고리즘에서 중복값의 경우 대부분 set이나 map을 통해서 줄여주면서 연산속도를 올려주는 공통점이 보이는데 나도 다음에는 적극사용해봐야 겠다

스프링 day6 복습

  • Entity에서 @Column(name)을 주는 이유에서 db와 Entity에 결합도를 낮춰주는것을 말씀하시면서 setName 메소드를 오버라이딩해서 다른 이름의 setter를 만들어 클라이언트 입장에서 좀더 나은 변수명을 사용할 수 있는 것을 예를 드셨었다.
    • 하지만 롬복때문에 setName 메소드를 바로 리팩토링 할 수는 없었고 setName을 Entity에 따로 구현을 해주고나서는 리팩토링을 할 수 있었다.
  • 요즘 수업들으면서 코드보다는 필기위주로하고 부족한건 나중에 채우자라고 생각해서 코드관리에 소흘했는데 실습한거 복습하면서 테스트좀 실행시켜보려고하면 되는게 없어서 답답하다.. 복습을 더 꼼꼼히해야되는 것 같다
  • 질문 사항 정리
    • 실습 중에 propagtion이 javax에도 있다고 하셨는데 복습해보니 없어서 찾아보니 비슷한게 TxType이 보이던데 이게 맞는건지? 요소들이 조금 다르던데 어떻게 다른지 궁금합니다
    • MANDATORY는 트랜잭션이 필수인데 자기자신이 트랜잭션을 생성하는게 아닌 부모 트랜잭션을 사용한다는점에서 requried와 다른건지 궁금합니다.
    • 질문사항은 내일 복습마저하고 취합해서 질문할 예정이다.

내일 공부할 내용

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

0개의 댓글