21년 1월 6일

한 일

  • 백준 1009, 1076, 1052, 1757번 문제를 풀었다.

    1. 1009번

      • (A * A) % N = ((A%N) * A) % N 이라는 간단한 공식을 이용해 풀 수 있는 문제였다.
      • 다만, 더 속도를 빠르게 하려면, A % N = R 일 때, A^b % N = R^b % N 이라는 사실을 이용해야 한다.
    2. 1076번

      • 간단한 HashMap을 이용하는 문제였다.

      • HashMap<String, Long> hm = new HashMap<>();
        hm.getOrDefault("key", 0);
        hm.get("key");
        hm.put("key", 1);
        hm.clear();
        hm.containsKey("key");
        for(Map.Entry<String, Long> entry : hm.entrySet()) {
          entry.getKey();
          entry.getValue();
        }
        
    3. 1052번
      • 2진법 변환하는 과정과 매우 흡사한 과정을 통해 최소로 압축된 물병 갯수를 구할 수 있다.
      • 복잡하게 생각하지 말고, 주어진 조건을 만족할 때까지, 구입할 물병 갯수를 1개씩 늘려가며 확인한다.
    4. 10757번
      • A+B를 더하는 문제이지만, 0 < A,B < 10^10000 이라는 무지막지한 크기를 가진다.
      • BigInteger를 사용해도 되지만 공부를 하기위해서 사용하지 않았다.
      • 이전에 배운 전가산기 개념을 이용해 10진수 sum, carry를 구하는 함수를 구현한다.
      • A와 B를 Int를 저장하는 배열이라고 생각하고 fulladder(전가산기)를 이용해 계산하면 된다. (나는 String으로 받아서 처리했다.)
  • 프로그래머스 [완주하지 못한 선수], [전화번호 목록], [위장], [베스트앨범], [주식가격], [기능개발] 풀었다.

    1. 풀었던 문제들이지만 Java로 처음 풀어서 Java에 대한 공부가 되었다.

    2. Comparator와 Comparable을 사용하여 Custom Sort를 할 수 있다.

      String[] phone_book = new String[]{"123","1215","321","21","6662"};
      List<String> phone_list = new ArrayList<>(Arrays.asList(phone_book));
      Comparator<String> comp = new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
          return o1.compareTo(o2);
        }
      };
             
      Arrays.sort(phone_book, Collections.reverseOrder(comp));
      Collections.sort(phone_list, Collections.reverseOrder(comp))
      
      public class Custom implements Comparable<Custom> {
             
        @Override
        public int compareTo(Custom other) {
          //내가 other보다 우선순위가 높으면 음수, 같으면 0, 낮으면 양수 반환
          return -1;
        }
      }
      
    3. Java에서 제공하는 Queue와 Stack 사용법을 익혔다.

      Stack<Integer> st = new Stack<>();
      st.push(1);
      st.peek();
      st.pop();
      st.clear();
      st.empty();
      
      Queue<Integer> que = new LinkedList<>();
      // enqueue
      que.add(1); //offer로 대체 가능, offer는 실패 시 false 반환, add는 exception
      // queue의 앞쪽 값
      que.element(); //peek로 대체 가능, peek는 실패 시 false 반환, element는 exception
      // dequeue
      que.remove(); //poll로 대체 가능, poll은 실패 시 false 반환, remove는 exception
      que.clear();
      que.isEmpty();
      
  • TCP/IP 쉽게, 더 쉽게
    • 12페이지까지 읽었다.
    • 컴퓨터 네트워크의 종류, 네트워크 교환 방식(회선 교환 방식, 패킷 교환 방식), 서버와 클라이언트의 차이 등을 읽었다.
    • 생각보다 입문자를 위한 내용 같아서 당황했지만, 알던 내용을 간략하게 훑고 가는 느낌이다.
  • git에 있던 java application 프로젝트를 클론 후 intellij로 열면 빌드와 런이 안되는 문제가 발생했고 해결했다.
    1. 클론한 프로젝트를 open한다.

    2. 소스코드가 들어있는 폴더를 우클릭한 후 Mark Directory as -> Sources Root를 클릭한다.

      alt text

      잘못한 것

  • 1052번 물병 문제에서, 너무 복잡하게 문제를 풀려다 시간만 날렸다.
    • Bruth force 방식이 무식하다고 생각하여, Log로 나눈 후 1개로 줄일 수 있는 물병을 빼고, 이 과정을 반복하여 풀려고 했다.
    • 제한 조건으로 시간복잡도를 계산해서 bruth force로 풀어도 되는지 확인하지 않았다.

잘한 것

  • 힘들다고 내려놓지 않고, TCP/IP 쉽게, 더 쉽게 책을 읽었다.
  • 엊그제와 어제 밀린 프로그래머스 문제를 포함하여 6문제를 풀었다.

느낌

  • 뭔가 엄청난걸 하지 않아도, 목표한 바를 꾸준히 이뤄내는게 중요한 것 같다.
  • 그림으로 배우는 TCP/IP책이 내용이 간단했지만, 피곤하다고 책을 펴지도 않은채 미루는 것과, 책을 펴서 10페이지라도 읽는 것은 성취감이 다르다.

할 일

  • 프로그래머스 2문제 풀기
  • TCP/IP 10쪽 읽기
  • Java의 정석 완독하기 (구체적 계획을 세우자)