Skip to content

Commit 3094d86

Browse files
committed
archive 2022 posts
1 parent 4bdb98c commit 3094d86

17 files changed

Lines changed: 390 additions & 8 deletions

.github/workflows/update-blog.js.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ jobs:
1515
build:
1616
env:
1717
# YEAR: $(date +%Y)
18+
YEAR: 2022
1819
SOURCE_DIR: ../../TIL/
1920
TARGET_DIR: ./private/_posts/
2021

TIL/2022-08-20.todo

Lines changed: 0 additions & 3 deletions
This file was deleted.

TIL/2022-08-21.todo

Lines changed: 0 additions & 4 deletions
This file was deleted.

TIL/2022/2022-07-30.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# log 2022-07-30
2+
3+
--------------------------
4+
5+
- [blog](#blog)
6+
- [study](#study)
7+
- [clean architecture in rx](#clean-architecture-in-rx)
8+
- [tags](#tags)
9+
10+
## blog
11+
12+
## study
13+
14+
### clean architecture in rx
15+
16+
생각을 해보자.
17+
interactor와 controller에서 이미 검증을 하는데, data access에서 또 입력 검증을 할 필요가 있나?
18+
입력 검증보다는 수행을 하다가 발생하는 에러만 던져주면 될 것이다.
19+
20+
다만, 여기서 수행하는건 입력 검증이 아니라 충돌 검증 등인데,
21+
여튼 rx 책을 보니 Try라는 오퍼레이터?를 만들어서 하는 방법도 나온다.
22+
근데 한 방법일 뿐이란 생각이 든다.
23+
24+
그리고, clean architecture의 소리치는 아키텍처 내용에 따르면, 아키텍처만 봐도 어떤 애플리케이션인지 알 수 있어야 한다는데,
25+
현재의 책의 구조대로면, 의존 관계에 따라 컨트롤러를 나눌 것이고..
26+
궁금한 것은, 그 컨트롤러들도 서로 분리되어야 하는가? 서로 참조가 있다면? 같은 계층이니 바로 가져와서 써야 할 것이므로 같은 컴포넌트이고, 따라서 분리되는 것이 아니다.
27+
그렇다면 결국 아키텍처는 컴포넌트별로 interactors, entities, data access interfaces 등으로 나뉠 것이다.
28+
근데 그렇게 되면 그게 소리치는 아키텍처 아닌가? '클린 아키텍처 책의 방식대로 된 아키텍처다'라고 외칠 뿐 아닌가?
29+
30+
그것보다 실질적이고 중요한 것은 로직을 주로 어디에 어떻게 두어야 하는가다.
31+
사용자를 추가하려는데, 아이디 충돌이 나지 않아야 한다는 것은, 비즈니스 로직의 문제인가, 저장 계층의 문제인가?
32+
내 생각에, 실질적으론 사용자를 id에 따라 검색하는 것이 비즈니스 요구사항은 아닐 것 같다. 다만 소프트웨어적 편리함 등의 문제로 id를 사용할 뿐.
33+
여튼 사용자의 id 기반 조회/변경/삭제 등이 비즈니스 로직이라 친다면 interactor에서 검사를 해야 할 것이고, 데이터 저장 계층만의 문제라면 저장 계층에서 해야 할 것 같다.
34+
그런데, 비즈니스 로직에서 검사했다면, 더 이상 아무런 검사 없이 data access 구현체에서 저장을 하도록 해도 괜찮을까?
35+
36+
37+
38+
39+
가상 스케줄러로 대기 없이 검사하는것도 흥미롭다.
40+
41+
42+
43+
44+
## tags
45+
- blog
46+
- study
47+
- clean-architecture
48+
- rxjs
49+
- typescript
50+
51+
--------------------------
52+
53+

TIL/2022/2022-08-09.md

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
# log 2022-08-09
2+
3+
--------------------------
4+
5+
- [blog](#blog)
6+
- [study](#study)
7+
- [leet study](#leet-study)
8+
- [tags](#tags)
9+
10+
## blog
11+
12+
## study
13+
14+
### leet study
15+
16+
https://leetcode.com/problems/search-in-rotated-sorted-array/
17+
18+
문제 이해가 잘 안된다.
19+
[0,1,2,4,5,6,7]
20+
21+
rotated at pivot index 3 and become [4,5,6,7,0,1,2].
22+
23+
아 잠만, 그냥 한번 읽으면 되지 않나 했는데, 시간복잡도가 O(lgN)이어야 한다고 한다.
24+
그러려면 한번 쭉 읽는것조차 허용되지 않는다.
25+
26+
일단, 이분탐색이든 값 이용이든 해야 한다.
27+
28+
그런데, 이분탐색하려면 정렬되어 있어야 하는데, 웬만큼 정렬되어 있긴한데 피봇이 가운데 있어서 애매하다.
29+
이 수열을 두 번 붙이면 가운데에 정렬된 원본 수열이 있겠지만, 어디부터 시작이고 끝인지 찾기가 애매하다.
30+
31+
값-인덱스 기법은 어떨까
32+
33+
[4,5,6,7,0,1,2] [4,5,6,7,0,1,2]
34+
35+
삼분탐색을 써야 하나 싶기도 한데..
36+
엣지케이스 처리하기 애매할듯
37+
38+
[0,1,2,3,4,5] [0,1,2,3,4,5]
39+
[5,0,1,2,3,4] [5,0,1,2,3,4]
40+
41+
1 <= nums.length <= 5000
42+
-10^4 <= nums[i] <= 10^4
43+
44+
딱히 값을 이용해서 더 빠르게 찾을 방법이 생각나지 않는데, 값-인덱스 기법은 대체로 비교보다는 동치연산에 쓰이므로..
45+
46+
[4,5,6,7,0,1,2]
47+
48+
최소나 최대값이라도 알면 ..
49+
지금 문제는, 이분탐색을 해야 하는데 정렬이 되어있지 않다는 것.
50+
51+
[4,5,6,7,8,0,1,2,3]
52+
53+
이런 경우 1을 찾으라 하면?
54+
55+
1. 큰 수인 8을 먼저 본 경우
56+
더 작은 수인 1을 찾으려 계속 왼쪽으로 가다가 못 찾고 끝난다.
57+
2. 작은 수인 0을 먼저 본 경우
58+
오른쪽 구간에서 성공적으로 1을 찾을 것이다.
59+
60+
그렇지만 이것은 pivot을 기준으로 양 옆을 찾은 덕분이고, 7과 8로 탐색을 시작한다면 둘 다 실패하게 된다.
61+
62+
그럼 어떻게 해야 하나?
63+
1. pivot을 일단 찾는 방법:
64+
- 왼쪽 수가 오른쪽 수보다 큰 것을 범위를 줄여가며 찾는다.
65+
회전이 되어있다면 오른쪽 끝 수가 왼쪽 끝 수보다 작다.
66+
67+
2. 양 끝에서 다른 탐색을 하는 방법:
68+
69+
아, 지금 생각해보니 일단 target이 왼쪽 끝 수보다 크다면 그 쪽에 있을거고,
70+
아니라면 오른쪽 파트에 있을 것이다.
71+
72+
증가하는 이분 탐색:
73+
74+
- target 찾으면 종료
75+
- 오른쪽으로 갔는데 숫자 감소하면 왼쪽 탐색
76+
- 왼쪽으로 갔는데 target보다 작으면 오른쪽 탐색
77+
- 오른쪽으로 갔는데 target보다 크면 왼쪽 탐색
78+
79+
감소하는 이분 탐색
80+
81+
- target 찾으면 종료
82+
- 왼쪽으로 갔는데 숫자 증가하면 오른쪽 탐색
83+
- 왼쪽으로 갔는데 target보다 작으면 오른쪽 탐색
84+
- 오른쪽으로 갔는데 target보다 크면 왼쪽 탐색
85+
86+
7트만에 성공..
87+
88+
도무지 이분탐색의 구간 엣지처리가 익숙해지질 않는다..
89+
90+
<details><summary markdown="span">py3 solution</summary>
91+
92+
```py3
93+
94+
def search(nums: List[int], target: int) -> int:
95+
import math
96+
first = nums[0]
97+
last = nums[-1]
98+
cnt = len(nums)
99+
100+
if target >= nums[0]:
101+
le = 0
102+
ri = len(nums)
103+
prev = -99999
104+
while (le <= ri):
105+
mid = math.floor((le + ri) / 2)
106+
if (mid >= cnt):
107+
return -1
108+
cur = nums[mid]
109+
print('1le',le,'ri',ri,'mid',mid, 'cur',cur)
110+
if (cur == target):
111+
return mid
112+
if (cur < first):
113+
ri = mid
114+
elif (cur > target):
115+
ri = mid
116+
elif (cur < target):
117+
le = mid + 1
118+
if (mid == prev):
119+
return -1
120+
prev = mid
121+
return le
122+
123+
le = -1
124+
ri = len(nums) - 1
125+
prev = -99999
126+
while (le <= ri):
127+
mid = math.ceil((le + ri) / 2)
128+
cur = nums[mid]
129+
print('2le',le,'ri',ri,'mid',mid, 'cur',cur)
130+
if (cur == target):
131+
return mid
132+
if (cur > last):
133+
le = mid
134+
elif (cur > target):
135+
ri = mid - 1
136+
elif (cur < target):
137+
le = mid
138+
if (mid == prev):
139+
return -1
140+
prev = mid
141+
return le
142+
143+
```
144+
145+
</details>
146+
147+
148+
```py
149+
150+
class Solution:
151+
def search(self, nums: List[int], target: int) -> int:
152+
if not nums:
153+
return -1
154+
l = len(nums)
155+
start = 0 # 안쓰는 변수
156+
end = l - 1 # 안쓰는 변수
157+
left = 0
158+
right = l - 1
159+
while left + 1 < right:
160+
mid = (right - left) // 2 + left # 그냥 분수로 계산하면 (le + ri) / 2와 같지만, 정수 연산이라 차이가 있을 듯.
161+
if nums[mid] == target:
162+
return mid
163+
elif nums[mid] > nums[right]: # mid가 right보다 크므로, mid~right 사이에 회전 존재
164+
if nums[mid] > target and target >= nums[left]: # left~mid 사이에 타깃 존재
165+
right = mid # left~mid 구간을 새 구간으로 설정
166+
else:
167+
left = mid # mid~right 사이에 타깃 존재, mid~right 구간을 새 구간으로 설정
168+
elif nums[mid] < nums[right] and nums[mid] > nums[left]: # mid가 right보다 작고, left보다는 크므로 구간 내 회전이 없음.
169+
if nums[mid] < target: # mid가 타깃보다 작으므로, mid 이후 구간 검색
170+
left = mid
171+
else: # mid가 타깃보다 크거나 같으므로, mid 이전 구간 검색
172+
right = mid
173+
else: # 그 외. left~mid 사이에 회전 존재
174+
if nums[mid] < target and target <= nums[right]: # mid가 타깃보다 작고, 타깃이 right보다 작음.
175+
left = mid # mid 이후 구간 검색
176+
else:
177+
right = mid # mid 이전 구간 검색
178+
179+
180+
181+
if nums[left] == target:
182+
return left
183+
if nums[right] == target:
184+
return right
185+
186+
return -1
187+
```
188+
189+
## tags
190+
- blog
191+
- study
192+
- sport
193+
- leet
194+
195+
--------------------------
196+
197+
Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,23 @@
1010
## blog
1111

1212
aws workmail 사용해서 개인 도메인 이메일 설정완료.
13-
좀 비싸긴 한데.. 귀찮으니 일단.
13+
계정당 4천원이라 좀 비싸긴 한데.. 다행히 여러 alias들을 한 계정으로 몰아넣을 수 있어서 쓸만할듯.
14+
귀찮으니 일단..
15+
1416

1517
추후 git secret 설정 필요
1618
문제는, m1 mac에서 또 커밋이 안된다.
1719

20+
```
21+
[2022-09-07T14:18:48.640Z] error: gpg failed to sign the data
22+
fatal: failed to write commit object
23+
```
24+
25+
gpg indicator가 뜨면서 비번 해제 해야 커밋이 될 텐데, 그게 아예 안 뜬다.
26+
만들 때 뭔가 잘못 만들었나?
27+
28+
29+
1830
## study
1931

2032
### solve cf 158b
File renamed without changes.
File renamed without changes.

TIL/2022/2022-09-24.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# log 2022-09-24
2+
3+
--------------------------
4+
5+
- [blog](#blog)
6+
- [study](#study)
7+
- [job](#job)
8+
- [tags](#tags)
9+
10+
## blog
11+
12+
## study
13+
14+
15+
## job
16+
17+
18+
## tags
19+
- blog
20+
21+
--------------------------
22+
23+

0 commit comments

Comments
 (0)