본문 바로가기

전체 글

(128)
[iOS] RxSwift와 Observable, operator 도대체 RxSwift는 무엇인가? RxSwift가 무엇인지 알려면 Reactive X가 무엇인지부터 알아야 한다. Reactive X의 공식 홈페이지를 보면 대문짝만하게 다음 설명이 나와있다. observable steams를 이용한 비동기 프로그래밍을 위한 API 라고 소개하고 있다. 이 문장으로 Reactive X는 비동기 프로그래밍을 위한 API라는 것까지는 알게 되었다. 하지만? observable? stream? 뭔소린지 도대체 알 수가 없다. 이 무수한 갈고리핑을 해결하기 위해 일단 웹 사이트에서 제공해주는 공식 문서들을 살펴보자. Reactive X 웹 사이트에 있는 문서들을 번역하도록 하겠다! 하지만 번역기를 거치지 않고 직접 하고 있다는 점에 유의 바란다. Introduction Reac..
[C++/LeetCode] Kth Smallest Element in a BST Daily LeetCoding Challenge for April, Day 18. 문제 Binary Search Tree에서 K번째로 작은 수를 구하는 것이다. 아이디어1: min heap binary sarch tree의 아이템을 순회하여 다 가져와서 min heap(priority queue)에 넣는다.그 후 priority queue에서 K번째의 아이템을 가져오면 됨 완성 submission: 21ms / 24.5MB /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullpt..
[C++/LeetCode] Convert BST to Greater Tree Daily LeetCoding Challenge for April, Day 16. 문제 다음과 같이 Binary Search Tree가 주어졌을 때 이를 반대로 만드는 것이다. 아이디어: DFS 어제에 이어서 오늘도 DFS를 사용한다. 로직을 짜기 전에 문제에서 값이 수정되는 원리를 파악해보자. root의 값은 어떻게 수정될까? 바로 [root->right의 수정으로 얻어진 값 중 가장 큰 값 + root->val] 의 결과이다. 따라서 가장 먼저 할일은 바로 root->right를 수정하는 것이다. 그 후 root->node의 값을 수정해준다. root->left의 값은 root node의 value를 더한 후에, root->left에 대해서 같은 로직을 반복하는 것이다. 그럼 root->right를 ..
[C++/LeetCode] Trim a Binary Search Tree Daily LeetCoding Challenge for April, Day 15. 문제 주어진 범위 내에 해당하는 원소들로만 이루어지도록 tree를 변경하기 아이디어 1: DFS DFS(Depth First Search) DFS는 BFS와 비교되는 개념으로, 진행할 수 있는 가장 깊은 node까지 확인하고 상위 노드로 돌아오는 방식이다. 문제의 경우는 다음과 같이 두 가지이다. root의 값이 범위 안에 속할 수 있고, 범위를 벗어날 수 있다. 1. 이때 범위 안에 속한다면 DFS를 활용하여, root->left, root->right 에 대해서도 trim 함수를 재귀적으로 적용해서 잘라진 가지를 가질 수 있도록 하면 된다. 2. 범위를 벗어나는 경우에는 root 자체가 변경되어야 하므로 Binary T..
Synchronization in LINUX - POSIX Semaphore로 producer-consumer 해결하기 동기화 기법 중 semaphore를 사용하는 방법을 알아보자 synchronization 2 지난 포스트에서 동기화 기법인 Lock에 대해서 살펴보았다. 하지만 spinlock이나 disabling interrupt는 short, simple critical section에서만 효과적이다. Mutual exclusion을 제외하고는 별달리 뭘 해주지 않기.. josushell.tistory.com Semaphore Implementation 은 두가지로 되어있다. - POSIX semaphore : 주로 스레드 동기화에 사용됨 - System V Semaphore : 주로 프로세스 동기화에 사용됨 이 중에서 IEEE에서 정한 UNIX의 표준 (syscall 기준)인 POSIX library로 알아보자. ..
[C++/LeetCode] Spiral Matrix II Daily LeetCoding Challenge for April, Day 13. 문제 이런 형태로 회전되어 숫자가 배치된 2차원 배열을 생성하는 것이다. 아이디어 방향을 전환하는 key를 만들어서 row, col index에 추가하면서 값을 채우자 이때 방향은 총 4개이다. (◀️🔼▶️🔽) 방향을 전환하는 조건은 row, col이 각각 0, n-1이 되는 경우이다. 즉 2차원 배열의 모서리에서 전환한다. 예외 사항 위 설명에도 있듯이, 꼭 2차원 배열의 모서리가 아니더라도 배열에 값이 채워져있는 경우에도 방향 전환이 필요하다. 따라서 이 예외 처리를 위해서 result 배열을 0으로 초기화하고, 0이 아닌 경우 즉 값이 있는 경우에도 방향을 전환하도록 구현한다. 완성 submission: 0ms / 6..
[C++/LeetCode] Game of Life Daily LeetCoding Challenge for April, Day 12 문제 2차원 vector의 값을 규칙에 맞게 변경하기 아이디어 2차원 vector를 돌면서 이웃한 cell 중에서 몇개의 1이 있는지 확인한 후, 값을 정한다. 완성 submission: 6ms / 6.9MB class Solution { public: void gameOfLife(vector& board) { int row = board.size(); int col = board[0].size(); vector result(row, vector (col, 0)); for(int i = 0;i < row;i++) { for(int j = 0;j < col;j++) { int sum = 0; for(int n = i - 1;n..
[iOS] side bar 라이브러리 없이 직접 구현하기 앱에서 정보를 숨기지만 접근하기 쉽게 만드는 UI는 무엇일까? 바로 side bar이다. 정보를 어느 정도 숨겨주지만 side bar를 터치하여 누르면 다양한 정보와 기능이 나타나도록 구현할 수 있어서 자주 사용된다. 이러한 side bar는 제공해주는 UI 요소가 아니기 때문에 직접 구현해야 한다. 다행히 많은 라이브러리들이 있지만 직접 sidebar 를 구현해보도록 하자. Custom Container View Controller container view controller는 다른 view controller와 달리 실질적인 화면, 자식 뷰 컨트롤러를 관리하는 역할만 한다. 예를 들어 tab bar controller, navigation view controller, page view contro..