본문 바로가기
728x90

분류 전체보기103

연습#22 안녕하세요. 오늘은 처음으로 트리 문제가 나왔고, 미루고 미뤄온 트리를 시작하게 됩니다. 다행히 개념만 알면 간단하게 풀 수 있는 문제여서 개념을 익히고 바로 문제를 풀었습니다. 144. Binary Tree Preorder Traversal 전위순회 문제였으며, 저는 DFS를 이용해서 풀었으며 많은 분들이 stack을 활용한 BFS로 풀었네요! class Solution { final List res = new ArrayList(); public List preorderTraversal(TreeNode root) { preorder(root); return res; } private void preorder(TreeNode root) { if (root != null) { res.add(root.val.. 2023. 12. 21.
연습#21 안녕하세요. 오늘도 Easy문제 하나를 풀었습니다. 876. Middle of the Linked List 링크드리스트 문제였는데, 음.. 그냥 링크드리스트가 무엇인지만 알면 풀 수 있는 문제라고 생각했으나, 다른 분들의 풀이를 보니 훨씬 빠르고 간결하게 푸는 방법이 있었습니다. 저는 전체 노드 개수를 구한 후 n/2까지 순회 후 반환하는 무식한 방법으로 접근했습니다. 다른 분의 굉장한 풀이는 다음과 같습니다. slow포인터와 fast포인터 두 개를 두고, slow는 하나씩 이동, fast는 두개씩 이동합니다. fast가 마지막 노드에 도달했을 때 (fast가 노드의 끝을 넘어버려서 null이거나 fast가 노드의 끝에 도달하여 fast.next가 null일 때) 그때 slow가 중간에 도달한 상태이므로.. 2023. 12. 21.
MVCC (Multi Version Concurrency Control) 안녕하세요. 오늘은 MVCC에 대해 알아보겠습니다. MVCC는 레코드 레벨의 트랜잭션을 지원하는 DBMS가 제공하는 기능이고, MVCC의 가장 큰 목적은 잠금을 사용하지 않고 일관된 읽기를 제공하는 데 있습니다. MySQL의 InnoDB는 Undo Log를 이용해 이 기능을 구현합니다. 멀티버전은 하나의 레코드에 대해 여러 개의 버전이 동시에 관리된다는 의미입니다. MySQL의 격리수준에서 READ_COMMITTED 이상의 격리수준은 이 MVCC를 이용하여 잠금 없는 일관된 읽기(Non-Locking Consistent Read)를 제공합니다. 아래 그림이 MySQL에서 UPDATE문장이 실행될 때 절차를 보여주는 그림입니다. 격리 수준이 READ_UNCOMMITTED인 경우에는 InnoDB 버퍼 풀이 .. 2023. 12. 21.
연습#20 안녕하세요. 연습#19에 이어서 바로 푼 문제가 12월 12일에 풀었던 문제였습니다. 소름돋는 점은 불과 일주일 전에 푼 건데 기억을 못한 것입니다ㅠㅠ 뭔가 지금 알고리즘 연습하는 과정이 적절하지 않은 것 같습니다. 알고리즘 연습 기록을 하면서 배운 것을 작성하고 있으니, 문제를 풀기 전에 한 번씩 그간 배운 것을 복습하는 과정을 넣어볼까 합니다. 일단 오늘 푼 문제는 다음과 같습니다. 387. First Unique Character in a String 이런 문제 보면 보통 배열로만 끝내시던데 저는 딱히 생각나는 방식이 없어서 Map을 통해서 쉽게 풀었습니다. 하지만 runtime과 memory사용량이 뒤에서 1~2등을 다투어서 적절한 방식은 아닌 것 같다는 생각을 했고, 배열로만 끝내는 방법을 꼭 .. 2023. 12. 20.
연습#19 안녕하세요. 오늘도 문제를 풀었습니다. 1470. Shuffle the Array 간단해서 빠르게 풀긴 했는데, index용 변수를 너무 많이 사용하였습니다. 총 4개를 사용하였네요 -_-;;; 문제 자체가 어렵지 않아서 4개를 사용할만 했지만, 하다가 좀 헷갈릴 수도 있겠다는 생각이 들었습니다. 아래 두개가 제일 깔끔해 보입니다. public int[] shuffle(int[] nums, int n) { int[] res = new int[2 * n]; for (int i = 0, j = n, idx = 0; idx < res.length; i++, j++) { res[idx++] = nums[i]; res[idx++] = nums[j]; } return res; } public int[] shuffl.. 2023. 12. 20.
연습#18 안녕하세요. 어제에 이어서 오늘도 하나 풀었습니다. 1122. Relative Sort Array 어찌저찌 풀긴 했으나, 너무 긴 rumtime이 나왔습니다. 대부분이 2ms 이내로 끊었는데 저는 5ms가 나왔네요. primitive를 모두 boxing하여 처리한 게 원인인가 싶기도 합니다. (근데 제가 생각한 풀이는 이렇게 하지 않으면 안됐습니다 ㅠ) 제 풀이는 다음과 같습니다. 먼저 arr2를 자신의 값을 key로 인덱스를 value로 가지는 map을 만듭니다. 그리고 arr1를 arr2의 원소인 것, 아닌 것 두개의 리스트로 나눕니다. 위에서 만든 두 개의 리스트를 각자의 정렬 알고리즘을 통해 정렬한 후 합쳐 반환합니다. 다른 분들의 풀이도 보았습니다. 문제에 elements는 1000개 이하라는 .. 2023. 12. 19.
연습#17 안녕하세요. 바쁘고 정신 없는 나날이었습니다. 물리적인 시간도 없었지만 정신적으로도 나태했었습니다. 그래서 목표로한 1일 1알고리즘 문제풀기 도전을 며칠간 못했습니다. 에너지를 충전했으니 다시 시작합니다! 일일 지표로 봤을 때는 상승과 하락을 반복하며 왔다갔다 하지만, 주 지표 월 지표로 보았을 때는 꾸준히 우상향 하고 있는 그래프를 그리는 것이 목표입니다. (삼성전자, 애플, 구글 등등 굴지의 대기업 주식 차트 처럼요ㅋㅋ) 어제는 leetCode의 링크드리스트 문제인 203. Remove Linked List Elements를 풀었습니다. 링크드 리스트는 당연히 알고 있었지만, 알고리즘 문제로는 처음 만난 유형이어서 조금 헤맸는데요. 핀의 힌트를 받아서 문제를 결국 풀긴 했습니다. 문제는, 링크드 리스.. 2023. 12. 19.
템플릿 메소드 콜백 패턴(Template Method Callback Pattern) 안녕하세요. 지난 번 포스팅인 템플릿 메소드 패턴에 이어서 비슷한 결이지만 방식은 다른 템플릿 메소드 콜백 패턴을 알아보려고 합니다. 템플릿 메소드 콜백 패턴은 템플릿 메소드 + 콜백이 합쳐진 것이라고 생각합니다. 템플릿 메소드 : 기본 골격이 있고, 그 곳에서 일부 단계(혹은 일부 다른 부분)를 구현할 수 있게 합니다. 콜백 : 이를 상속이 아닌 인터페이스를 통한 위임을 사용하고, 메서드의 매개변수에 이 인터페이스를 전달하여 특정 시점이나 상황에 호출되게 합니다. 지난번 사용한 예제를 그대로 템플릿 메소드 콜백 패턴으로 변경해보겠습니다. 지난번과 같이 템플릿이 되어줄 클래스가 필요합니다. public class RestaurantRobot { public final void hello(final Nam.. 2023. 12. 14.
템플릿 메소드 패턴 (Template Method Pattern) 안녕하세요! 오늘은 템플릿 메소드 패턴을 한 번 만들어보려고 합니다. 템플릿 메소드 패턴은, 전체적인 구조(템플릿)를 상위클래스에서 정의하고 일부 영역을 변경할 수 있게끔 만들어서 중복을 줄이고 코드를 재사용할 수 있게 합니다. 일종의 IoC인 템플릿 메소드 패턴은 많은 프레임워크, 라이브러리에서 사용하고 있습니다. 왜 일종의 IoC냐면, 하위 클래스에서 구현한 추상메소드가 결국 상위 클래스의 흐름에 따라 호출되기 때문입니다. 즉 제어는 상위클래스에서 이루어지는 것입니다. UML Class Diagram에서 보이는 것처럼 템플릿 메소드 패턴은 상속을 통해 이루어집니다. 코드로 한 번 보겠습니다. 앞으로 나올 코드를 간단하게 설명하자면, 레스토랑에서 손님이 들어왔을 때 인사하는 로봇의 인사(hello) 메.. 2023. 12. 14.
연습#16 이전 문제가 너무 쉬워서 바로 한 문제 더 풀었습니다. 2215. Find the Difference of Two Arrays 모든 숫자들을 Set에 넣어 중복을 제거하고, Set들의 차집합을 구하는 문제였습니다. 이것도 쉬웠습니다. 다른 분들의 솔루션을 보니 다 이런 방식으로 접근한 것 같습니다. 2023. 12. 14.
연습#15 안녕하세요! 굉장히 쉬운 문제를 또 풀었습니다. 2011. Final Value of Variable After Performing Operations 하지만 쉬운건 쉬운거고, 오늘도 다른 분들의 풀이를 보면서 감탄했습니다. 가운데에 식별자가 있고, 이 식별자만을 보고 풀이를 하는 거였습니다. 포인트는 아래와 같다고 생각합니다. 1. 규칙을 찾느냐 2. +/-에 해당하는 ASCII Code를 떠올릴 수 있느냐 class Solution { public int finalValueAfterOperations(String[] operations) { int x = 0; for(String o : operations) x += (44 - o.charAt(1)); return x; } } 다른 분들의 풀이를 보니.. 2023. 12. 14.
TCP 연결 종료시 상태 전이 안녕하세요! 오늘은 TCP 연결 종료시의 상태를 한 번 살펴보려고 합니다. 대표적인 클라이언트와 서버 입장에서의 전이만 표현했습니다. 전체적인 TCP 상태 전이는 다른 포스팅에서 작성해보겠습니다. 아래 발그림을 같이 보겠습니다. 보통 Client가 연결 종료를 시작하는 Active Close를 하게 됩니다. 그렇다면 서버는 연결 종료 시작을 받는 Passive Close를 하게 됩니다. 클라이언트는 FIN을 보내고 ACK를 받으면서 FIN_WAIT_1 -> FIN_WAIT_2 상태로 들어가게 됩니다. 이 때, 서버로부터 FIN이 오기 전까지 클라이언트는 half-close 상태로 계속해서 데이터를 수신할 수 있습니다. (물론 half-close를 할 수 있도록 프로그래밍 해야하며, half-close에 .. 2023. 12. 13.
728x90