전체 글 422

[Linked List][Easy] 21. Merge Two Sorted Lists.

https://leetcode.com/problems/merge-two-sorted-lists/description Q. 두개의 정렬된 리스트를 하나의 리스트로 병합하라. Solution. 직관대로 그냥 하면 되겠다. 더보기 C# public ListNode MergeTwoLists(ListNode list1, ListNode list2) { ListNode head = null; ListNode n1 = list1; ListNode n2 = list2; ListNode prev = null; while(n1!=null || n2!=null) { int v1 = n1!=null ? n1.val : int.MaxValue; int v2 = n2!=null ? n2.val : int.MaxValue; Lis..

[Linked List][Medium] 19. Remove Nth Node From End of List

https://leetcode.com/problems/remove-nth-node-from-end-of-list/description Q. 단일 리스트에서 뒤에서 n 번째 노드를 찾아 제거하여라. Solution. 우선 단일 리스트에서 뒤에서 n 번째 노드를 어떻게 찾는가. 노드 두개를 가지고 하나를 먼저 출발시킨다. (fastNode) 이 노드가 앞에서 n번째 진행하면, 그 후에 다음 노드를 head에 둔다.(slowNode) fastNode가 리스트에 끝에 도달할 때까지 두 노드를 하나씩 진행 시킨다. 이 결과, slowNode가 바로 뒤에서 n 번째 노드가 된다. 이제 이 slowNode만 삭제하면 되겠다. 우리가 앞에서 부터 진행하므로, slowNode의 바로 앞노드를 알 수 있다.(prevNod..

[Linked List][Medium] 2. Add Two Numbers.

https://leetcode.com/problems/add-two-numbers/description A. 두개의 단방향 linked list가 주어질때 각 자리수는 숫자의 digit 자리수 값을 의미한다. 이때 주어진 두개의 리스트 값을 digit에 맞게 계산하여 다시 리스트로 반환하라. Solution. 리스트가 단방향이다. 뒤집어야 하나, 생각해 봤지만, 그럴 필요 없이, 각 자리수 대로 합해주고 출력한다. 더보기 public ListNode AddTwoNumbers(ListNode l1, ListNode l2) { ListNode prev = null; ListNode head = null; bool bHasOverflow = false; while(l1!=null || l2!=null || b..

[Heap][Medium] 347. Top K Frequent Elements

https://leetcode.com/problems/top-k-frequent-elements/description Q. 주어진 숫자배열 nums에서 k번째까지 많이 나오는 수의 목록를 찾아 반환하라. Solution 먼저 출현 빈도를 알아야 하니, frequency buff를 만든다. 다음으로, 이 출현 빈도만큼, map 이나 heap에 넣어 정렬되도록 한다. 그리고 k 만큼 해당하는 수를 찾아 리스트에 넣어 반환한다. 논리대로 코드를 만든다 . 더보기 vector topKFrequent(vector& nums, int k) { unordered_map mapBuff; for(int k = 0; k < nums.size(); ++k) { mapBuff[ nums[k] ]++; } map mapOrde..

[SG] Fire Effect

https://www.youtube.com/watch?v=XyOAk4rlIUY 2D fire용 불꽃을 만드는 방법을 알아본다. idea는 간단하다. 2개의 노이즈를 섞어서 불꽃같이 만들고 적절히 마스킹해서 불꽃이 보여지는 영역에만 그려지게 한다. 마지막으로 컬러를 덧붙이고, 전체 영역에서 불꽃이 보여지는 영역만 알파를 씌여 보여지게 한다. 쉐이더 그래프는 링크의 유튜브 영상으로 대신한다. 결과.

[Structural Patterns] 특징과 사용례.

Adapter ; AuthenticateAdaptor 플랫폼간 인증 인자가 다를 때, 내부 서버에 내부 포맷으로 최종적으로 정리해서 보낼 무언가가 있어야 한다. 그때 adaptor를 사용하여 정리 작업을 진행한다. 특정 수정/변화를 특정 클래스로 한정시킨다. Bridge Adaptor와 거이 유사한 경우에 사용하나, Adaptor는 보다 기존 모듈간 연결시, Bridge는 개발해 나가는 특정 모듈에 대해 주로 사용하는 듯 보인다. Composite ; UIComposite 특정 객체가 다시 같은 객체를 재귀적으로 품을 수 있는 경우, 해당 객체 관리를 위해 사용한다. Decorator ; GameCardViewer - 카드를 먼저 그리고, 데이터에 따라 추가적으로 Hot, Vertical 등의 아이콘을 ..

[Creational Patterns] 특징과 사용례.

Factory Method ; ResolutionSolver ; AuthticationProvider ; MonsterProvider 객체 생성 주도를 외부에서 입력받는 객체에 의지하게 한다. 새로운 타입 추가 시 추가되는 타입에 대해서만 최소한의 코드가 추가된다. Pool ; SymbolCreator ; ParticleGenerator 많은 수의 프로토타입을 먼저 만들어서 풀을 만들고 그 풀안의 객체를 재사용한다. 메모리 재할당 방지. 캐시메모리 낭비 방지. Prototype ; HeroProvider ; MonsterProvider 미리특정 객체를 만들어 놓고, 생성요청이 발생하면 처음부터 다시 만드는게 아닌, 만든 객체를 복사하여 돌려준다. Builder ; PizzaBuilder ; Worldbu..

[Heap][Hard] 295. Find Median From Data Stream

Q. 주어진 값들의 중앙값을 반환하는 클래스를 만들어라. 이때 중앙값은, 값들의 수가 홀수일때는 가운데 존재하는 값, 짝수일때는 가운데 양 옆 두수의 평균을 말한다. Solution. 입력된 수들을 정렬 했을 때, 가운데 지점을 찾아야 한다. 따라서 솔루션 1. 값을 리스트에 계속 추가하고, 가운데 값을 구할 시 정렬하고 중간값을 찾는다. -> 정렬에 O(N x LogN)이 매번 소모된다. 비 효율적이다. 솔루션 2. map 등의 구조를 사용하여 넣을 시 정렬한다.O(logN) -> 중간값을 찾을 때 위치 순회하는데, O(N/2) 이 소모된다. 나쁘진 않아 보이지만, 더 효율적인 방법을 생각해 본다. 솔루션 3. 두개의 priority queue를 활용해 본다. 중간값보다 작은 녀석들은 max heap ..

Leetcode/Challenges 2024.04.06

[Architecting] Why would we need this?

아키텍팅, 즉 시스템 디자인이 왜 필요한가 에 대해서 먼저 생각해 본다. 프로그래머는 코드 생성, 즉 프로그래밍을 통해 전반적으로 2개의 의무를 수행한다. 첫째는 기능 구현으로서의 의무다. 프로그램을 통해서 사람은 컴퓨터에게 필요한 기능을 위임한다. 계산기 같은 것이 쉬운 예이다. 입력을 받으면, 그 입력을 기반으로 컴퓨터가 프로그램에 가이드 된 내용을 토대로 결과를 돌려준다. 심플하다. 둘째로 전체 디자인을 효율적으로 유지해야 할 의무를 가진다. 그렇다면 여기서 몇 가지 파생 질문이 나온다. 효율적이라는 것을 무엇을 말하는 것인가? 왜 그래야 하는가? - 비 효율적이어도 프로그램은 여전히 잘 기능할 수 있다. 그렇다면, 어떻게 이 과정에 실제적으로 도달하는가? 등을 고민해 볼 수 있다. 첫번째 질문부터..