01/05

HackerRank

01/12

클린코더

01/14

클린코더

01/19

HackerRank

  • Common Child
  • 이건 어려웠다. 다른 풀이들을 검색해서 참고 후 작성함 ㅠㅠ
  • 자괴감에 하나 더 품.
  • Making Anagrams
  • 이건 너무 쉬움. ㅠㅠ
  • 2차원 배열을 활용하는 문제에 약한 게 아닌가 생각이 듦.
  • 그래프 문제를 node 방식이 아니라 2차원 배열로 풀어보자.
  • 그 외에도 관련된 문제 몇 개 더 풀이 예정.

01/23

HackerRank

  • 일단, 남아 있는 문자열 퀴즈인 Alternating Characters를 작성.
  • 그리고 2차원 배열을 활용한 문제를 몇 개 더 풀자는 취지에 맞게,
  • DFS: Connected Cell in a Grid를 작성함.
  • 확실히 다른 문제 풀이에 비해 좀 더 시간이 소요됨.
  • 3개 정도 더 풀고 기존과 어떻게 달라졌는지 비교해 볼 예정.

01/27

HackerRank

  • BFS: Shortest Reach in a Graph 추가
  • 그리고 이제부터는 풀이 과정에서 기억하면 좋을 만한 것도 함께 기록.
  • 다른 문제와 다르게 이 문제는 Scanner를 직접 작성해야 했음.
  • 이차원 배열이 아닌, Node, Graph 등의 자료구조를 직접 작성해야 하기 때문으로 추정.
  • 다른 그래프 문제를 풀어보면 알 수 있을 듯.
  • 그러고 보니, Scan#nextInt라는 좋은 메서드가 있는데,
  • 왜 기본으로 제공되는 코드들에는 nextLine().trim().toInt()를 쓰는지 궁금.
  • 당연한 얘기지만 ArrayDeque 자료구조의 이해가 기본.
  • 왜 이 자료구조를 쓰는지, add, remove, offer, poll, push, pop의 차이는 뭔지 등.
  • 만약, Deque가 아닌 Queue로만 쓰인다면, 의도를 좀 더 명확히 드러내고 실수를 방지하기 위해 여기와 같이 그 쓰임을 제한할 수도.

ArrayDeque

ArrayDeque 얘기가 길어지는 듯 하여 여기에 다시 한 번 정리.

Deque

먼저 Deque 설명.

  • ArrayDequeDeque의 구현체.
  • DequeQueue의 확장인터페이스.
  • java doc의 Deque 설명 첫 번째 문장은 아래와 같음.

A linear collection that supports element insertion and removal at both ends.

  • 여기서 기억할 만한 것은 both ends.
  • 마침 “de”는 “double ended”를 가리키는 말.
  • 그러니 Deque는 “double ended queue”를 가리키는 것.
  • 따라서, 양쪽 끝으로 insert, remove, examin 연산을 제공.
  • 그리고 이 연산들은 두 가지 형태로 제공됨.
  • 예외를 던지거나 boolean 등의 특수 값을 반환하거나.
  • 정리하면 아래와 같음.
구분 First Element (Head) First Element (Head) Last Eelement (Tail) Last Eelement (Tail)
형태 exception special value exception special value
insert addFirst(e) offerFirst(e) addLast(e) offerLast(e)
remove removeFirst(e) pollFirst() removeLast() pollLast()
examine getFirst() peekFirst() getLast() peekLast()
  • special value 형태는 보통 capacity-restricted를 위한 것이긴 하나,
  • Deque의 일반적인 구현체들은 자신이 가진 엘리먼트 갯수의 제한이 없음.
  • ArrayDeque를 생각해 보면 됨.
  • Deque는 Queue 인터페이스의 확장이라 했다.
  • Queue의 FIFO에 대응하는 Deque 연산들은 아래와 같음.
Queue Method Equivalent Deque Method
add(e) addLast(e)
offer(e) offerLast(e)
remove() removeFirst()
poll() pollFirst()
element() getFirst()
peek() peekFirst()
  • Deque는 LIFO 스택에도 사용.
  • 참고로, 레거시 Stack 클래스보다 Deque 사용을 권장.
Stack Method Equivalent Deque Method
push(e) addFirst(e)
pop() removeFirst()
peek() peekFirst()

ArrayDeque

다음으로 ArrayDeque 설명.

Resizable-array implementation of the Deque interface.

  • 용량 제한 없음. 필요하면 늘어남.
  • 일단, ArrayDeque 생성자는 아래와 같음.
  • 그리고 addLast, addFirst를 함께 보면 내부 동작 원리가 보임.
public ArrayDeque() {
    elements = new Object[16];
}

... (중략)

public void addFirst(E e) {
    if (e == null)
        throw new NullPointerException();
    elements[head = (head - 1) & (elements.length - 1)] = e;
    if (head == tail)
        doubleCapacity();
}

public void addLast(E e) {
    if (e == null)
        throw new NullPointerException();
    elements[tail] = e;
    if ( (tail = (tail + 1) & (elements.length - 1)) == head)
        doubleCapacity();
}
  • 여기에 ArrayDeque 구현체의 그림 설명이 잘 되어 있음.
  • 하나만 가져와 보면 아래와 같음.

array deque head & tail

  • 그 외에도 thread-safe 하지 않으며,
  • null 엘리먼트 사용 불가.
  • 스택으로 사용될 땐 Stack 보다 빠르고,
  • 큐로 사용될 땐 LinkedList 보다 빠름.
  • 당연히(?) 대부분의 연산이 amortized constant time.

02/02

HackerRank

  • Find the nearest clone 문제 풀이
  • 하지만 이상하게 Test case 9, 10에서 Timeout 발생.
  • CNode를 없애고, Map<Int, Set<Int>> 형태로 간선을 관리하고, 루프를 하나 제거해도 마찬가지.
  • 결국, 여기에서와 같이 CNode에서 제거해도 되는 value 필드를 제거. 통과됨. 이건 HackerRank의 문제라고 생각됨.
  • 한편, 이 문제는 kotlin 버전으로도 풀 수 없게 되어 있다.
  • 그래도 처음엔 Kotlin 버전으로 작성. 좀 더 간결함.

02/03

클린코더

  • 7장 인수테스트
  • 회사에서 가볍게 읽다가, 제대로 읽어야 겠다고 생각해서 집에 가져와 기록하며 읽음.

02/13

클린코더

  • 압박
  • 최근 바쁜 상황이라 더 마음속 와 닿는 내용.

02/20

마이크로서비스 아키텍처 구축

03/06

마이크로서비스 아키텍처 구축

03/08

마이크로서비스 아키텍처 구축

03/09

마이크로서비스 아키텍처 구축

03/14

MySQL 퍼포먼스 최적화

03/15

MySQL 퍼포먼스 최적화

03/22

MySQL 퍼포먼스 최적화

03/28

Spring Batch

03/29

Spring Batch

  • 어제 살펴본 내용들을 기반으로 간단한 배치 애플리케이션 작성.
  • https://github.com/codehumane/message-schedule-demo
  • 예전과 크게 달라진 것은 없어 보임.

03/30

Spring Batch

어제 작업한 배치 데모(https://github.com/codehumane/message-schedule-demo) 보완.

  • JobParameters 활용.
  • @JobScope 사용에 따른 인터페이스 아닌 구현체(프록시 목적) 주입.
  • JpaPagingItemReader 대신 RepositoryItemReader 사용.
  • 설정과 애플리케이션 로직 분리.
  • spring.batch.job.names 반드시 지정하도록 설정 및 유효성 검사.

벌써, 2020년 2Q 시작.

04/04

HackerRank

04/05

HackerRank

04/07

코딩인터뷰 완전분석

  • 바쁘다는 핑계로 뜸했는데 조금씩이라도 다시 읽으려 함.
  • 비트 조작” 추가.

04/14

코딩인터뷰 완전분석

04/30

HackerRank

Ice Cream Parlor

  • Hash Tables: Ice Cream Parlor 풀이
  • Kotlin 버전으로 작성했는데 Submit 하면 다 틀리다고 나옴.
  • 아무리 봐도 이상해서 Java 버전으로 바꿔서 Submit 하면 성공함.
  • 여러 번 문제를 겪고 나니, 다음부터는 Java로 풀기로.

Pairs

05/01

HackerRank

Triple Sum

05/03

코딩인터뷰 완전분석