Doa's blog

소프트웨어와 투자를 연구합니다

Leetcode - My Calendar II

문제 내용 https://leetcode.com/problems/my-calendar-ii/ 스케줄이 동시에 3개가 겹치는지를 판단해야하는 문제 솔루션 접근1 종료 시간을 기준으로 정렬을 해서 바로 앞과 앞앞을 비교해면 되지 않을까 생각해봄. 경우의 수가 많아져서 이 방법은 아니다라고 판단. 접근2 힌트를 읽어봄. 음 스케줄과 겹친 스케줄, 2개를 각각 보관하는 방법. 2개의 스케줄이 겹치냐를 판단하는 코드가 헷갈림 (-_- 미치겠다) if (a.start < b.end && b.start < a.end) { // 겹친다 } 위 코드를 이해하는데 한참 생각했다. 접근3 솔루션 읽고 한참 생각했다.

정규표현식 With Golang

예제코드 package main import ( "fmt" "regexp" ) func main() { match, _ := regexp.MatchString("p[a-z]+ch", "peach") fmt.Println(match) r, _ := regexp.Compile("p([a-z]+)ch") fmt.Println(r.MatchString("peach")) fmt.Println(r.FindString("peach")) fmt.Println(r.FindStringIndex("hel peach")) fmt.Println(r.FindStringSubmatch("punch")) fmt.Println(r.FindAllString("peach punch pinch", -1)) fmt.Println(r.ReplaceAllString("peach po pinch", "xxx")) } 결과 true true peach [4 9] [punch un] [peach punch pinch] xxx po xxx

[코딩] 2개의 노드 비교

2개의 노드의 값이 같은지 비교하는 코드를 짜보자. null 처리를 포함한 간결한 코드 작성 방법 2가지를 적는다. 1. And-Or-Value func compare(l, r *TreeNode) bool { // 2개 모두 nil 이면 같다 if l == nil && r == nil { return true } // 위에서 2개 모두가 nil 인 경우를 이미 처리했으므로 // 하나만 nil인 경우에 해당하므로 같지 않다. if l == nil || r == nil { return false } // 최종 값 비교 return l.

[알고리즘] 이진트리 In-order 순회

iterative type TreeNode struct { Val int Left *TreeNode Right *TreeNode } func inorder(root *TreeNode) { var st []*TreeNode // 처음 stack에 담지 않는다 for root != nil || len(st) > 0 { for root != nil { st = append(st, root) root = root.Left } root = st[len(st)-1] st = st[:len(st)-1] // pop fmt.Println(root.Val) root = root.Right } } recursive func inorder(root *TreeNode) []int { res := []int{} if root !

투자용어 정리

가산금리 spread라고도 함. 금리를 정할 때 기준금리에 덧붙이는 위험가중 금리를 말함 신용이 높으면 위험이 줄어들므로 가산금리도 낮다. 명목금리 금융자산의 액면금액에 대한 금리 실질금리 명목금리에서 물가상승률을 뺀 금리. 실질적인 금리 (실질금리 = 명목금리 - 물가상승률) 은행에서 이자 10%를 준다고하면 명목금리가 10%이지만 그 해 물가상승률이 3%이면 실질금리는 7%가 됨 실질금리가 하락하면 기대수익이 떨어지니 금값이 뛰는 현상이 있다. 표면금리 채권의 액면가액에 대한 연이자 외평채 외국환평형기금채권의 약어.

[알고리즘] DFS & BFS 패턴

DFS 재귀 procedure DFS(G, v) is label v as discovered for all directed edges from v to w that are in G.adjacentEdges(v) do // 넣을 때 방문 확인 및 처리를 한다 if vertex w is not labeled as discovered then recursively call DFS(G, w) 반복 procedure DFS_iterative(G, v) is let S be a stack S.push(v) while S is not empty do v = S.pop() // 꺼낸 다음에 방문 확인 및 처리를 한다 if v is not labeled as discovered then label v as discovered for all edges from v to w in G.

[알고리즘] 이진검색 패턴

이진검색을 구현하는 것은 대게 어렵지 않으나 구현할 때마다 헷갈린다. 아래와 같이 구현하면 대부분의 경우를 만족시킬 수 있다. 패턴 arr := []int{1, 1, 2, 2, 2, 4, 4, 5, 5, 5} l := 0 r := len(arr) // 배열 끝 index보다 1이 커야 한다 t := 3 // target for l < r { // 혹은 l != r // floor를 적용 // (l + r)/2는 overflow가 발생할 수 있음 m := l + (r-l)/2 if arr[m] < t { // 왼쪽 영역 + 가운데를 버리는 조건 // floor적용에 따른 무한루프 방지를 위해 left에 1을 더함 l = m + 1 } else { // 오른쪽 영역을 버리는 조건 r = m } } // t의 존재 유무가 필요한 경우 if arr[l] == t { fmt.

[투자] 기업 재무제표와 손익계산서 용어 정리1

기업의 재무제표와 손익계산서에 나오는 용어를 정리해보자. 재무제표 자산 과거의 거래나 사건의 결과로서 현재 기업실체에 의해 지배되고 미래에 경제적 효익을 창출할 것으로 기대되는 자원 쉽게 설명하면, 현재 가지고 있는 돈 될 만한 자원 + 과거의 거래로 인하여 받게 될 돈 될 만한 자원 유동자산 단기간 내에 자금으로 회수 또는 전환할 수 있는 자산. 보통 1년 이내의 것을 말함. 현금·미수금·외상 매출금·재고 상품 따위 반대는 비유동자산 부채 과거의 거래나 사건의 결과로서 현재 기업실체에 의해 지배되고 미래에 경제적 효익의 희생 쉽게 말해 빚 유동부채

[Golang] Embedding

임베딩(Embedding)에 대해 알아보자. 자바의 상속과는 달리, Golang은 임베딩을 지원한다. Effective java를 보면 ‘상속 대신 조합(composition)을 하라’라고 하는데 여기의 조합과 임베딩은 유사한 개념이다. 참고로 상속은 부모-자식간 강한 커플링을 맺게 되므로 좋지 않다. 조합은 내부 구성품에 접근하기 위한 getter/setter가 필요하지만 임베딩은 이조차 필요없이 흡수(?)가 된다는 면에서 차이가 있다. interface와 struct 모두 임베딩이 가능하다. 단, interface는 interface만 포함할 수 있다. struct는 struct과 interface 둘 다 포함할 수 있다. 임베딩을 하게 되면 안쪽에 있는 메소드를 바깥쪽에서 마음데로 가져다 쓸 수 있다.

[Golang] Goroutine을 이용한 분산처리

피보나치를 일꾼 4명에게 동시에 계산하도록 만들어보자. 설명 worker는 일꾼이고 모두 goroutine으로 실행된다. jobs와 results는 각각 작업들과 결과물들을 전달하는 buffered 채널이다. worker 내부에는 jobs 채널로 부터 일을 계속 수신하고 그 결과는 results 채널로 전달한다. jobs 채널에 0~99까지의 작업을 전달한다. jobs에는 총 100개의 작업을 전달하고 jobs 채널을 종료(close)한다. 메인 스레드는 results 채널에서 오는 결과를 기다리고 있다. 코드 func main() { jobs := make(chan int, 100) results := make(chan string, 100) for i := 0; i < 100; i++ { jobs <- i } close(jobs) go worker(1, jobs, results) go worker(2, jobs, results) go worker(3, jobs, results) go worker(4, jobs, results) for i := 0; i < 100; i++ { fmt.