문제 내용 https://leetcode.com/problems/my-calendar-ii/
스케줄이 동시에 3개가 겹치는지를 판단해야하는 문제
솔루션 접근1 종료 시간을 기준으로 정렬을 해서 바로 앞과 앞앞을 비교해면 되지 않을까 생각해봄.
경우의 수가 많아져서 이 방법은 아니다라고 판단.
접근2 힌트를 읽어봄.
음 스케줄과 겹친 스케줄, 2개를 각각 보관하는 방법.
2개의 스케줄이 겹치냐를 판단하는 코드가 헷갈림 (-_- 미치겠다)
if (a.start < b.end && b.start < a.end) { // 겹친다 } 위 코드를 이해하는데 한참 생각했다.
접근3 솔루션 읽고 한참 생각했다.
예제코드
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개의 노드의 값이 같은지 비교하는 코드를 짜보자.
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.
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 재귀 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년 이내의 것을 말함. 현금·미수금·외상 매출금·재고 상품 따위 반대는 비유동자산 부채
과거의 거래나 사건의 결과로서 현재 기업실체에 의해 지배되고 미래에 경제적 효익의 희생 쉽게 말해 빚 유동부채
임베딩(Embedding)에 대해 알아보자.
자바의 상속과는 달리, Golang은 임베딩을 지원한다.
Effective java를 보면 ‘상속 대신 조합(composition)을 하라’라고 하는데 여기의 조합과 임베딩은 유사한 개념이다.
참고로 상속은 부모-자식간 강한 커플링을 맺게 되므로 좋지 않다. 조합은 내부 구성품에 접근하기 위한 getter/setter가 필요하지만 임베딩은 이조차 필요없이 흡수(?)가 된다는 면에서 차이가 있다. interface와 struct 모두 임베딩이 가능하다. 단,
interface는 interface만 포함할 수 있다. struct는 struct과 interface 둘 다 포함할 수 있다. 임베딩을 하게 되면 안쪽에 있는 메소드를 바깥쪽에서 마음데로 가져다 쓸 수 있다.
피보나치를 일꾼 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.