TIL 20/01 - 20/04
01/05
HackerRank
01/12
클린코더
- “프로의 마음가짐” 추가
- 새해 읽는 첫 번째 기술(?)서적
- 1장부터 뼈 아픈 내용
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
설명.
ArrayDeque
는Deque
의 구현체.Deque
는Queue
의 확장인터페이스.- 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 구현체의 그림 설명이 잘 되어 있음.
- 하나만 가져와 보면 아래와 같음.
- 그 외에도 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
마이크로서비스 아키텍처 구축
- Monitoring 기록 추가.
03/08
마이크로서비스 아키텍처 구축
- Monitoring 기록 완료.
- 보안 정리 추가.
03/09
마이크로서비스 아키텍처 구축
- 대규모 마이크로서비스 정리 추가.
03/14
MySQL 퍼포먼스 최적화
- MySQL의 특징 추가
03/15
MySQL 퍼포먼스 최적화
- 쿼리 성능 진단은 최적화의 기초 추가
- WHERE 조건 이해 추가
- SQL 레벨에서의 접근법 추가
03/22
MySQL 퍼포먼스 최적화
- 스키마 레벨에서의 접근법
- 한창 재밌게 읽음. 짧아서 아쉽. 끝.
03/28
Spring Batch
- Spring Boot Reference Documentation 문서에 “How-to” Guides라고 있음. 그 중에서도 Batch Applications을 여기에 간단히 정리. 아주 짧음.
- 스프링 배치 자체는 Spring Batch - Reference Documentation 살펴볼 예정.
- Creating a Batch Service 가이드도 함께 참고.
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
- 오랜만의 HackerRank.
- 문제는 Roads and Libraries.
- 일단 실패하는 테스트 케이스로 뼈대 작성.
- 다음으로, isolated subgraphs가 없다고 가정하고 구현.
- 마지막으로, isolated subgraphs가 있다고 가정하고 구현.
04/05
HackerRank
- 어제의 구현을 submit 해보면 일부 케이스 timeout이 발생.
- 공간을 좀 덜 쓰는 bfs로 바꿔 봄.
CityNode
라는 별도의 값 객체 사용 대신visited
와neibhgors
를 배열 사용하는 방식도 사용.- 사용하는 컬렉션연산을 보면 당연히 의미 없음을 알고서도 MutableSet 대신 Array로 바꿔보기도.
- 2월에 겪었던 HackerRank의 문제인가 싶어서, bfs라면 굳이 없어도 되는
CityNode
의 value 필드를 제거해 보기도 함. - 혹시나 싶어 처음의 구현을 자바 버전으로 바꿔 submit 해보니, 바로 성공함.
- Kotlin은 아직도 지원이 부족한 듯.
- 내 아까운 시간 ㅠㅠ
04/07
코딩인터뷰 완전분석
- 바쁘다는 핑계로 뜸했는데 조금씩이라도 다시 읽으려 함.
- “비트 조작” 추가.
04/14
코딩인터뷰 완전분석
04/30
HackerRank
Ice Cream Parlor
- Hash Tables: Ice Cream Parlor 풀이
- Kotlin 버전으로 작성했는데 Submit 하면 다 틀리다고 나옴.
- 아무리 봐도 이상해서 Java 버전으로 바꿔서 Submit 하면 성공함.
- 여러 번 문제를 겪고 나니, 다음부터는 Java로 풀기로.
Pairs
- 이번엔 그냥 처음부터 Java로 작성함.
- 깊게 생각 안 하고 일단 풀이
- 살짝 코드 개선
05/01
HackerRank
Triple Sum
05/03
코딩인터뷰 완전분석
- 수학 및 논리 퍼즐.
- 가장 먼저 소수 이야기.
- 다음으로 확률 이야기.
- 나머지 내용은 기록 생략.
© 2020 codehumane ― Powered by Jekyll and Textlog theme