본문 바로가기

분류 전체보기74

SOLID SOLID란? 클린코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리한 것. SOLID의 5가지 내용 SRP : 단일 책임 원칙 OCP : 개방-폐쇄 원칙 LSP : 리스코프 치환 원칙 ISP : 인터페이스 분리 원칙 DIP : 의존관계 역전 원칙 하나하나 뜯어 보자! SRP (single responsibility principle) 한 클래스는 하나의 책임만을 가져야 한다. 쉽게 말해 변화가 있을 때 최대한 적은 수정을 할 수 있어야 한다. OCP (Open/Closed principle) 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. 다형성을 최대한 활용해야 함. LSP (Liskov substitution principle) 프로그램의 속성을 변경하지 않고.. 2022. 3. 18.
[자료구조] 우선순위큐(Priority Queue)에 사용되는 Heap 자료구조 서론 우선순위큐를 사용하며 이 자료구조를 정확히 이해하기 위해선 그 전에 힙을 완벽히 이해하여야 겠다는 생각이 들었다. 이전과 같이 모르는 것을 그냥 넘어가는 일이 없도록 하자. Heap Priority Queue 데이터에 가중치를 두어 가중치의 오름차순 또는 내림차순으로 정렬한 큐. 주로 시뮬레이션 시스템, 작업 스케줄링에 사용. 배열 또는 연결 리스트로도 구현이 가능하지만 힙 자료구조를 사용하는 것이 가장 효과적. 리스트를 사용하여 구현한 경우 삽입의 시간 복잡도는 O(1), 삭제의 시간 복잡도는 O(n). Heap을 사용하여 구현한 경우 삽입과 삭제 모두 시간 복잡도는 O(logN) Heap 자료구조의 개념 배열을 기반으로 한 완전 이진 트리로 구성. 일반적 이진 트리와 다르게 중복된 값을 허용. .. 2021. 10. 25.
[Algorithm] Programmers_42579_베스트 앨범_Go Go 우선순위큐 연습 package q42579 import ( "container/heap" "fmt" ) type Genre struct { name string amount int } type Song struct { num int cnt int } type sPQ []*Song func (s sPQ) Len() int { return len(s) } func (s sPQ) Less(a, b int) bool { if s[a].cnt == s[b].cnt { return s[a].num s[b].cnt } func (s sPQ) Swap(a, b int) { s[a], s[b] = s[b], s[a] } func (s *sPQ) Push(x i.. 2021. 10. 13.
[Go] Heap 자료구조를 사용하는 우선순위 큐 (Priority Queue) 서론 Go 에는 Priority Queue가 없다. 심지어 Queue 조차 없다. 그 이유는 예상컨데 너무 쉽게 Queue라 불리우는 자료구조를 구현할 수 있기 때문이 아닐까 싶다. 아무리 쉽지만 이해하지 않고 사용한다면 쉽게 느껴지지 않을테다. 내가그랬다.. 우선순위큐를 사용해야한다면 다른 언어를 통해 알고리즘을 풀어버린 나약한 선택을 했다.. 간단히 공부를 하고보니 예전에 예제를 보며 왜 이 복잡한 일을 개발자에게 맡기는거야! 라고 생각했지만 그 정도로 복잡한 내용이 아니었다. 살펴보자. Priority Queue 란? FIFO(First In First Out)의 특징을 가지는 자료구조인 Queue. 이 Queue 자료구조에서 우선순위를 주어 힙을 통해 우선순위를 기준으로 O(nlogn)의 시간 복.. 2021. 10. 4.
[Go] 클로저(Closure)를 활용하여 생성기(generator) 제작 클로저란? 클로저는 더 가까이란 뜻의 Closer가 아니라 닫힘을 의미하는 Closure이다. 일반적으로 함수 외부에서 작성된 데이터를 함수에서 사용하기 위해서는 매개변수를 사용하여 받은 값을 수정한 후 이를 리턴하는 방식을 사용한다. 하지만 이 클로저라는 기법을 사용한다면 함수 외부에서 작성된 지역변수를 함수 내에서 마음대로 접근하는 것이 가능해 진다. 예시 간단한 코드를 통해 알아보는 것이 가장 확실한 방법이 아닐까 한다. func main() { val := 0 f := func() { val++ } f() fmt.Println((val)) } 결과 : 1 생성기란? 하나의 분리된 캡슐화된 객체를 생성하는 패턴이라 생각할 수 있다. 클로저를 이용한 생성기 코드 import "fmt" func gen.. 2021. 10. 2.
[Algorithm]Programmers_월간코드챌린지_86052_빛의 경로 사이클_Go 링크 링크 : 빛의 경로 사이클 풀이 방법 문제 설명 빛이 "S"가 써진 칸에 도달한 경우, 직진합니다. 빛이 "L"이 써진 칸에 도달한 경우, 좌회전을 합니다. 빛이 "R"이 써진 칸에 도달한 경우, 우회전을 합니다. 빛이 격자의 끝을 넘어갈 경우, 반대쪽 끝으로 다시 돌아옵니다. 예를 들어, 빛이 1행에서 행이 줄어드는 방향으로 이동할 경우, 같은 열의 반대쪽 끝 행으로 다시 돌아옵니다. 생각해야 할 것 주어진 칸을 생각하며 간단히 좌회전, 우회전을 할 방법을 생각해 낸다. 0 : 위, 1 : 오른쪽, 2 : 아랫쪽, 3 : 왼쪽 으로 지정하여 기존의 방향에서 우회전일 경우 +1, 좌회전일 경우 -1을 해 방향을 지정해 준다. 격자의 범위를 지나칠 때 반대쪽에서 다시 나타나는 방법을 생각해 낸다. p.. 2021. 10. 1.