ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ฏ RxSwift ์ดํดํ๊ธฐ_02
RxSwift ์ดํดํ๊ธฐ_01 - https://jayb-log.tistory.com/275
RxSwift ์ดํดํ๊ธฐ_03 - https://jayb-log.tistory.com/277
โ
- ๐ ์ด ๊ธ์ RxSwift์ ๋ํ ์์ฒญ๋ ์ดํด๋ ๋ณธ์ง์ ํ์ ํ๋ค๊ธฐ๋ณด๋ค ์ ๋ฌธํ๋ ์ ์ฅ์์ ์์ฑํ๋ ๊ธ์ด์์! ๊ณฐํ๊น๋์ ๊ฐ์(ํ๋จ์ ๋งํฌ) ๋ฅผ ๋ค์ผ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ, ์๊ฐ๋ค์ ์์ฑํ ์์ ์ด์์. ํ๋ฆฐ ๋ถ๋ถ์ด๋ ์ถ๊ฐํ๋ฉด ์ข์ ๋ถ๋ถ์ ๋ํ ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์์ ๋๋ค :]
๐ง๐ปโ๐ป Operators๋?
ReactiveX์์๋ Operators๋ฅผ ๋ง ๊ทธ๋๋ก "์ฐ์ฐ์"๋ผ๊ณ ํํํ๊ณ ์์ด์. ์ฐ์ฐ์ ์๊ฐ๋ฅผ ์ ์ ๋ณผ๊ฒ์!
ReactiveX๋ฅผ ์ง์ํ๋ ์ธ์ด ๋ณ ๊ตฌํ์ฒด๋ค์ ๋ค์ํ ์ฐ์ฐ์๋ค์ ์ ๊ณตํ๋๋ฐ, ์ด ์ค์๋ ๊ณตํต์ ์ผ๋ก ์ ๊ณต๋๋ ์ฐ์ฐ์๋ ์์ง๋ง ๋ฐ๋๋ก ํน์ ๊ตฌํ์ฒด์์๋ง ์ ๊ณตํ๋ ์ฐ์ฐ์๋ค๋ ์กด์ฌํ๋ค. ๋ํ, ์ธ์ด๋ณ ๊ตฌํ์ฒด๋ค์ ์ด๋ฏธ ์ธ์ด์์ ์ ๊ณตํ๋ ๋ฉ์๋์ ์ด๋ฆ๊ณผ ์ ์ฌํ ํํ๋ก ์ฐ์ฐ์์ ๋ค์ด๋ฐ ์ปจ๋ฒค์ ์ ์ ์งํ๊ณ ์๋ค.
ReactiveX์์ ์ง์ํ๋ ๋ค์ํ ์ธ์ด๊ฐ ์๊ณ , ๊ณตํต์ ์ธ ๋ฉ์๋๋ ์์ง๋ง ํน์ ํ ์ธ์ด์์๋ง ์ ๊ณต๋๋ ๋ฉ์๋๊ฐ ์๋ค๋ ์ค๋ช ์ด์์. RxKotlin์๋ ์์ง๋ง RxSwift์๋ ์๋ ๋ฉ์๋๊ฐ ์๋ค๋ ๋ป์ด๊ฒ ์ฃ ?
Operators Chain
Optional Chaining์ฒ๋ผ ์ฐ๋ฌ์ ์ฒ๋ฆฌํ๋ Chaining ์์ ์ Rx์ Operators์์๋ ํ ์ ์๋ค๋ ๋ง์ด์์.
ํน์ ํด๋์ค๊ฐ ์ ๊ณตํ๋ ์ฌ๋ฌ ๋ฉ์๋๋ค์ ํธ์ถํ์ฌ ํด๋์ค์ ํญ๋ชฉ๋ค์ ๋ณ๊ฒฝํ๋ ๋น๋ ํจํด๊ณผ ๊ฐ์ ๊ฒ๋ ์กด์ฌํ๋ค. ๋น๋ ํจํด ์ญ์ ์ฐ์ฐ์ ์ฒด์ธ๊ณผ ์ ์ฌํ๊ฒ ๋ฉ์๋ ์ฒด์ธ์ ์ ๊ณตํ๋ค. ํ์ง๋ง, ๋น๋ ํจํด์ ๋ฉ์๋ ์ฒด์ธ๊ณผ๋ ๋ฌ๋ฆฌ Observable์ ์ฐ์ฐ์ ์ฒด์ธ์ ํธ์ถ ์์์ ๋ฐ๋ผ ์คํ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ์ฐจ์ด์ ์ด ์๋ค.
๋ฐ๋ผ์, Observable์ ์ฐ์ฐ์ ์ฒด์ธ์ ์๋ณธ Observable๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋ ์ ์๊ณ ์์๋๋ก ์คํ๋์ด์ผ ํ๋ค. ์๋ํ๋ฉด, ์ด๋ฏธ ์ดํดํ๊ณ ์๋ฏ์ด ์ฐ์ฐ์ ์ฒด์ธ์์ ๋จผ์ ์คํ๋ ์ฐ์ฐ์๊ฐ ๋ฆฌํดํ Observable์ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ ์ฐ์ฐ์๊ฐ ๋์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์นดํ ๊ณ ๋ฆฌ ๋ณ ์ฐ์ฐ์
์์ธํ ์ค๋ช ์ Operators ์์ ๋ณผ ์ ์์ด์. ์นดํ ๊ณ ๋ฆฌ์๋ ์์ฑ, ๋ณํ, ํํฐ๋ง ๋ฑ์ด ์๊ณ ์๋ฅผ ๋ค์ด ์์ฑ ์นดํ ๊ณ ๋ฆฌ์๋
Create
โ ์ง์ ์ ์ธ ์ฝ๋ ๊ตฌํ์ ํตํด ์ต์ ๋ฒ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ Observable์ ์์ฑํ๋คDefer
โ ์ต์ ๋ฒ๊ฐ ๊ตฌ๋ ํ๊ธฐ ์ ๊น์ง๋ Observable ์์ฑ์ ์ง์ฐํ๊ณ ๊ตฌ๋ ์ด ์์๋๋ฉด ์ต์ ๋ฒ ๋ณ๋ก ์๋ก์ด Observable์ ์์ฑํ๋คEmpty
/Never
/Throw
โ ์์ฃผ ์ ํํ๊ณ ์ ํ๋ ํ๋์ ํ๋ Observable์ ์์ฑํ๋คFrom
โ ๋ค๋ฅธ ๊ฐ์ฒด๋ ์๋ฃ ๊ตฌ์กฐ๋ฅผ Observable๋ก ๋ณํํ๋คInterval
โ ํน์ ์๊ฐ๋ณ๋ก ์ฐ์๋ ์ ์ํ์ ๋ฐฐ์ถํ๋ Observable์ ์์ฑํ๋คJust
โ ๊ฐ์ฒด ํ๋ ๋๋ ๊ฐ์ฑ์งํฉ์ Observable๋ก ๋ณํํ๋ค. ๋ณํ๋ Observable์ ์๋ณธ ๊ฐ์ฒด๋ค์ ๋ฐํํ๋คRange
โ ์ฐ์๋ ๋ฒ์(Range)์ ์ ์๋ฅผ ๋ฐํํ๋ Observable์ ์์ฑํ๋คRepeat
โ ํน์ ํญ๋ชฉ์ด๋ ์ฐ์๋ ํญ๋ชฉ๋ค์ ๋ฐ๋ณต์ ์ผ๋ก ๋ฐฐ์ถํ๋ Observable์ ์์ฑํ๋คStart
โ ํจ์์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ถํ๋ Observable์ ์์ฑํ๋คTimer
โ ์ง์ ๋ ์๊ฐ์ด ์ง๋๊ณ ๋ ํ ํญ๋ชฉ์ ํ๋ ๋ฐฐ์ถํ๋ Observable์ ์์ฑํ๋ค
๊ฐ์ ๊ฒ๋ค์ด ์์ด์.
์ด Operators ์ค ์ผ๋ถ๋ฅผ ํ๋ ํ๋ ์ดํด๋ณด๋๋ก ํ ๊ฒ์!
โ๏ธ Operators์ ์ข ๋ฅ
Just
just ์ฐ์ฐ์์ ์ ์๋ ์๋์ ๊ฐ์์.
Just
โ ๊ฐ์ฒด ํ๋ ๋๋ ๊ฐ์ฑ์งํฉ์ Observable๋ก ๋ณํํ๋ค. ๋ณํ๋ Observable์ ์๋ณธ ๊ฐ์ฒด๋ค์ ๋ฐํํ๋ค
์ข ๋ ์ฝ๊ฒ ์ค๋ช ํด๋ณผ๊ฒ์. ์๋ ์ฝ๋ ์ญ์ ๊ณฐํ๊น๋์ ์์ ์ฝ๋์์.
@IBAction func exJust1() { Observable.just("Hello World") .subscribe(onNext: { str in print(str) }) .disposed(by: disposeBag) }
์์์ just์ "Hello World"๋ผ๋ String์ ๋ฃ์ด์คฌ์ด์. just๋ ์ด ์์ ๋ฌด์ธ๊ฐ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋ค์ ๋ฒ์ ๊ทธ๋ฅ ์ ๋ฌ์ด ๋์. just ํ์ subscribeํ ๋์ ์ ๋ฌ ํ๋ผ๋ฏธํฐ๋ก ๊ทธ๋ฅ ๊ทธ ๊ฐ์ด ๋ด๋ ค์์. ์ฆ
.subscribe(onNext: { str in
์์ str์ ์์์ ๋์ด์จ "Hello World"๊ฒ ์ฃ ?
๊ทธ๋ผ ์๋์ ๊ฒฝ์ฐ์๋ ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋์ฌ๊น์?
@IBAction func exJust2() { Observable.just(["Hello", "World"]) .subscribe(onNext: { arr in print(arr) }) .disposed(by: disposeBag) }
๋น์ฐํ arr์ ["Hello", "World"]์์. ์ฆ just๋ ๊ทธ ๊ฐ์ด ๋จ์ผ String์ด๋ฉด ๋จ์ผ String, Array๋ฉด Array๋ฅผ ๊ทธ๋๋ก ์ ๋ฌํด์ค์(๋ญ ๋ฃ๋ ๋ฃ์ ๊ทธ๋๋ก).
From
From์ ์ ์๋ ์๋์ ๊ฐ์์.
From
โ ๋ค๋ฅธ ๊ฐ์ฒด๋ ์๋ฃ ๊ตฌ์กฐ๋ฅผ Observable๋ก ๋ณํํ๋ค
From์ ๋จผ์ ์์์ฝ๋๋ฅผ ๋ณผ๊ฒ์.
@IBAction func exFrom1() { Observable.from(["RxSwift", "In", "4", "Hours"]) .subscribe(onNext: { str in print(str) }) .disposed(by: disposeBag) }
from์ Array๊ฐ ๋ค์ด์ฌ ๊ฒฝ์ฐ, ๊ทธ ์์ ์๋ ์์๋ฅผ ํ๋์ฉ ๋์ด์ ๋ด๋ ค๋ณด๋ด์ค์. ์์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๊ฒฐ๊ณผ๋ฌผ์ด
/** ์ถ๋ ฅ ๊ฒฐ๊ณผ RxSwift In 4 Hours */
์ฒ๋ผ ๋์์. ์ฆ Iterableํ๊ฒ str์ ํ๊ฐ์ฉ ๋ด๊ธฐ๊ฒ ๋์.
์ฌ๊ธฐ์ ์์ฉ์ ํด์ ๋ง์ฝ 4๊ฐ String ํํ๊ฐ ์๋๋ผ Int ํํ๋ผ๋ฉด?
Swift๋ ํ Array์ ์ฌ๋ฌ ํ์ ์ ๊ฐ์ ๋ฃ์ ์ ์์ด์. ๊ทธ๋์ ๋ค๋ฅธ ์์๋ค๊ณผ ๋ค๋ฅด๊ฒ 4๋ง Int๋ผ๋ฉด
Observable.from(["RxSwift", "In", 4, "Hours"]) ...
์๋ฌด ๋ฌธ์ ์์ด ์๋ํด์. ์ฆ from์ ๊ฐ์ ํ์ ๋ง ์ฒ๋ฆฌํ์ง ์์์. ๋ค๋ง ๊ทธ๋ ๊ฒ ๋๋ฉด str์ด๋ผ๋ ๋ค์ด๋ฐ์ ๋ฐ๊ฟ์ฃผ๋๊ฒ ์ข๊ฒ ์ฃ ? 4๋ผ๋ int ๊ฐ์ด str์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง๋๊น์ :)
Map
Map
โ Observable์ด ๋ฐฐ์ถํ ํญ๋ชฉ์ ํจ์๋ฅผ ์ ์ฉํ๋ค
Map์ ์ฌ์ค Swift ๊ณ ์ฐจํจ์์ ๊ฑฐ์ ๊ฐ์ ๊ฐ๋ ์ผ๋ก ๋๊ปด์ ธ์ ๊ตณ์ด Rx์ Operators๋ก ์ค๋ช ํ๊ธด ๊ทธ๋ ์ง๋ง, ์๋ค๋ ์ฌ์ค์ ์๋ ๊ฒ๋ ์ค์ํ๋๊น์!
@IBAction func exMap1() { Observable.just("Hello") .map { str in "\(str) RxSwift" } .subscribe(onNext: { str in print(str) }) .disposed(by: disposeBag) }
์ด์ ๋ ์กฐ๊ธ ์ต์ํด์ง ์ฝ๋๋ฅผ ์ดํดํด๋ณด๋ฉด, just๋ฅผ ํตํด "Hello"๋ฅผ ๋๊ฒจ์ฃผ๊ณ ์ด๋ฒ์๋ subscribe๊ฐ ์๋ map์์ ์ด "Hello"๋ฅผ ๋ฐ๊ฒ ์ฃ ? ๊ทธ๋ฆฌ๊ณ mapping์ ํ๋๋ฐ ์ฌ๊ธฐ์ str์ด "Hello"๋๊น ๊ฒฐ๊ณผ๋
"Hello RxSwift"
๊ฐ ๋ ๊ฑฐ์์. ๊ทธ ํ subscribeํ๋ฉด str์ just์์ ๋์ด์จ"Hello"
๊ฐ ์๋๋ผ"Hello RxSwift"
๊ฐ ๋์.ํ๋ฒ ๋ ๋ณผ๊ฒ์!
@IBAction func exMap2() { Observable.from(["with", "๊ณฐํ๊น"]) .map { $0.count } .subscribe(onNext: { str in print(str) }) .disposed(by: disposeBag) }
์ด ์ฝ๋์ ๊ฒฝ์ฐ from์ด๋๊น element๋ฅผ ํ๊ฐ์ฉ ๋๊ฒจ์ฃผ๊ณ , ์ด๋ฒ์๋ ๋ณ์๋ก ๋ฐ๋๊ฒ ์๋๋ผ ๋ฐ๋ก $0์ผ๋ก ๋ฐ์๋ค์!
๊ทธ๋ผ ๊ฐ ๊ธ์จ์ ๊ธ์์๋ฅผ ๋ฐํํ๊ฒ ์ฃ ?
mapping์์ ๊ธ์ ์๋ฅผ ๋ฐํํ๊ณ subscribe์์ ๊ทธ๊ฑธ ์ถ๋ ฅํด์ฃผ๋๊น 4, 3์ด ๋ฐํ๋ ๊ฑฐ์์.
count ๋ฉ์๋์ ๊ฒฐ๊ณผ๋ฌผ์ด Int๋ผ ์ฌ์ค ์ฌ๊ธฐ์๋ subscribe์์ str์ด ์๋๋ผ int๋ก ๋ช ๋ช ๋๋๊ฒ ์กฐ๊ธ ๋ ์ข์ ๋ค์ด๋ฐ ๊ฐ์์(๋ฌผ๋ก ์ค์ ์ํฉ์ด๋ฉด ํ์ ์ด๋ฆ๋ณด๋ค ๋ค๋ฅธ ๊ฑธ ์ฌ์ฉํ๊ฒ ์ง๋ง๐).
Filter
Filter
โ ํ ์คํธ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํญ๋ชฉ๋ค๋ง ๋ฐฐ์ถํ๋ค
filter๋ ์์ map๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ณ ์ฐจํจ์์ ์ฐจ์ด๊ฐ ๋ณ๋ก ์๊ธฐ ๋๋ฌธ์ ์ดํดํ๊ธฐ ์ฌ์ ์ด์! ๋ง ๊ทธ๋๋ก ํํฐ๋ง์ ํตํด ์ด๋ค ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฐ๋ค๋ง ๋ฐํํด์ฃผ๋๊ฑฐ์ฃ .
@IBAction func exFilter() { Observable.from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) .filter { $0 % 2 == 0 } .subscribe(onNext: { n in print(n) }) .disposed(by: disposeBag) }
1๋ถํฐ 10๊น์ง ๊ฐ์ from์์ ๋ด๋ ค์ฃผ๋๋ฐ filter์์ ๊ฒ์ฌ๋ฅผ ํด์.
๋ง์ฝ ๊ทธ ๊ฐ์ด ์ง์๋ฉด(2๋ก ๋๋ ๋๋จธ์ง๊ฐ 0) subscribe๋ก ๋ด๋ ค๊ฐ๊ณ subscribe์์ ์ถ๋ ฅํด์ค์.
๊ทธ๋ผ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฌผ์
/** ์ถ๋ ฅ ๊ฒฐ๊ณผ 2 4 6 8 10 */
๊ฐ ๋๊ฒ ๋ค์ :]
๐ Operators ์์ฉํด๋ณด๊ธฐ
์์์ ํด๋ณธ Operators๋ก ์์ฉ ์ฝ๋๋ฅผ ํด์ํด๋ณผ๊ฒ์.
@IBAction func exMap3() { Observable.just("800x600") .map { $0.replacingOccurrences(of: "x", with: "/") } // 1 .map { "https://picsum.photos/\($0)/?random" } // 2 .map { URL(string: $0) } // 3 .filter { $0 != nil } // 4 .map { $0! } // 5 .map { try Data(contentsOf: $0) } // 6 .map { UIImage(data: $0) } // 7 .subscribe(onNext: { image in // 8 self.imageView.image = image }) .disposed(by: disposeBag) // 9 }
์ฐ์ just๋ฅผ ํตํด "800x600"์ด๋ผ๋ String์ด ๋ด๋ ค๊ฐ์.
๊ทธ ๋ค์์ ํ๋ฆ์ ์ดํด๋ณผ๊ฒ์(๋ฒํธ๋ ์์ ์ฃผ์์ ๋ฐ๋ผ์).
map์ ํตํด ๋ฌธ์์ด์ x๋ฅผ /๋ก ๋ฐ๊ฟ์ค์. ๊ทธ๋ผ 800x600์ด 800/600์ด ๋๊ฒ ์ฃ ?
map์ผ๋ก url์ ๋ง๋ค์ด์. ์์์ ๋ด๋ ค์จ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ด๋ ค์ค๋๊น
"https://picsum.photos/800/600/?random"
์ด ๋๊ฒ ๋ค์! ์ด๊ฑธ ์์์ 1๋ฒ์์ replace ํด์ค๊ฑฐ๊ตฐ์.
์์ String์ URL ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ค์.
์ฌ๊ธฐ์ filter๋ฅผ ํ๋๋ฐ ์๊ฐํด๋ณด๋ฉด 3๋ฒ URL์ Optional์ด์์. ์๋ํ๋ฉด ์ด์ํ String์ URL๋ก ๋ง๋ค๋ ค๊ณ ํ๋ค๋ฉด ๋น์ฐํ nil์ด ์๊ฒจ์ผํ๋๊น์! ๊ทธ๋์ nil์ด ์๋ ๊ฒฝ์ฐ๋ง ๊ฑธ๋ฌ์ฃผ๋ ์์ ์ ํด์.
4๋ฒ์์ nil ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ํด์คฌ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ธ๋ํ์ ํด๋ ์ ๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ผ์ด ์์ด์!
URL์ ์๋ ๋ด์ฉ์ ๋ค์ด ๋ฐ์ ๋ฐ์ดํฐ๊ฐ ๋์์.
6๋ฒ์ ๋ฐ์ดํฐ๋ก ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด์. ์ฌ๊ธฐ์ ๊ฒฐ๊ณผ๋ฌผ์ UIImage? ๊ฐ ๋์.
7๋ฒ์ UIImage?๋ฅผ ImageView์ ๋ฃ์ด์ค์.
disposeBag์ insert ํด์ฃผ๋ ์์ ์ด์์!
์์ ๊ณผ์ ์ด ์ผ๋ จ์ ํ๋ฆ์ ๋ง๋ค๊ณ ์์ฃ ? 1ํธ์์ ์ด์ผ๊ธฐํ RxSwift์ ์ ์๋ฅผ ๋ค์ ํ ๋ฒ ๋ณผ๊ฒ์
An API for asynchronous programming with observable streams
์ฌ๊ธฐ์ observable streams๋ผ๋ ํํ์ด ๋์ค๋๋ฐ์, ์ฌ๊ธฐ์ ๋งํ๋ stream์ด ๋ฐ๋ก ์ด๋ฌํ ํ๋ฆ์ ์๋ฏธํด์!
์ฆ, observe ํ ์ ์๋ ์คํธ๋ฆผ์ ํตํด ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ค๋ ๊ฒ์ด๊ณ , ๊ทธ๊ฒ ๋ฐ๋ก ์ ํฌ๊ฐ ๋ฐฉ๊ธ ํด ๋ณธ ๊ฒ์ ๋ํ ์ค๋ช ์ด์์ :]
3ํธ์์ ์ด์ด๊ฐ ๋ณผ๊ฒ์!
'iOS ์ฑ๊ฐ๋ฐ > iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] - RxSwift ๊ฐ๋ ์ดํดํ๊ธฐ_04 (0) | 2021.10.24 |
---|---|
[iOS] - RxSwift ๊ฐ๋ ์ดํดํ๊ธฐ_03 (0) | 2021.10.17 |
[iOS] - RxSwift ๊ฐ๋ ์ดํดํ๊ธฐ_01 (0) | 2021.10.17 |
[iOS] - Texture ์ค์นํ๊ธฐ (0) | 2021.08.20 |
[iOS] - View Controller (0) | 2021.06.08 |
- Total
- Today
- Yesterday
- ๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ#BackTracking
- ๋ณ๋ ๋์ดํธ#BOJ#ํ์๋ฒ#Python
- NumberofDiscIntersections#Codility#Sort#Python
- filter#isalnum#lower
- ๋๋ฌด์๋ฅด๊ธฐ#BOJ#์ด๋ถํ์#Python
- ํฐํ๋น์น#๋ฆฌ์ฝ#xbox#controller
- ๋ฆฌ๋ชจ์ปจ#์์ ํ์#BOJ#Python
- Distinct#Codility#Python
- ๋ฐ๋ณต์์ด#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ๋ ์ง ๊ณ์ฐ#BOJ#์์ ํ์#Python
- ๊ณต์ ๊ธฐ ์ค์น#BOJ#์ด๋ถํ์#Python
- ๋ฐฐ์ดํฉ์น๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- ์์ด์ฌ์ดํด#BOJ#Python
- django
- Brackets#Stacks and Queues#Codility#Python
- Triangle#Sorting#Codility#Python
- ๋ฏธ๋ก ํ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ํ์ด์ฌ์๊ณ ๋ฆฌ์ฆ์ธํฐ๋ทฐ#4์ฅ
- ํ ๋งํ #๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ์ฌ์๊ฐ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- API#lazy#
- ํ ํ๋ก์ ํธ#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- django#slicing
- PassingCars#Codility#Python
- N์ผ๋ก ํํ#DP#Programmers#Python
- Swift#Tuples#Range
- ์ข ์ด์๋ฅด๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- ์ํธ์ฝ๋#dp#BOJ#Python
- ์ฟผ๋ํธ๋ฆฌ#BOJ#๋ถํ ์ ๋ณต#Python
- ๋์ ์๋ฅด๊ธฐ#์ด๋ถํ์#BOJ#Python
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |