Programming
iOS: UIStackView
iOS: UIStackView
2021.08.10์ด๋ฒ์ UI ๊ตฌ์ฑํ๋ฉด์ ์คํ ๋ทฐ๋ฅผ ์ฌ์ฉํ๊ฒ ๋์๋ค. ์ด๋ฏธ ํ ๋ฒ ๋ณธ ๋ด์ฉ์ธ๋ฐ๋, ๋ง์ ๋ค์ ํ๋ ค๋๊น ์ด๋ ต๊ณ , ํท๊ฐ๋ ค์ ๋ค์ ๊ณต๋ถํ๋ฉด์ ๋ด์ฉ์ ์ ๋ฆฌํ๋ค. UIStackView @MainActor class UIStackView: UIView A streamlined interface for laying out a collection of views in either a column or a row. ์ด์ด๋ ํ์ ๋ทฐ ์ปฌ๋ ์
์ ๋ฐฐ์นํ๊ธฐ ์ํ ๊ฐ์ํ๋ ์ธํฐํ์ด์ค์
๋๋ค. ์ฝ๊ฒ ๋งํ๋ฉด, ๊ฐ๋ก๋ ์ธ๋ก๋ก ๋ ์ด์์์ ๋ฐฐ์นํ ๋ ์ฌ์ฉํ๋ค. ์คํ ๋ทฐ ๋ด๋ถ์ ๋ค๋ฅธ ์คํ ๋ทฐ๋ฅผ ์ค์ฒฉํด์ ๋ ๋ณต์กํ ๋ ์ด์์์ ๋ง๋ค ์ ์๋ค. Android์ LinearLayout๊ณผ ์ ์ฌํ๋ค. ์คํ ๋ ์ด์์์ผ๋ก ์ง์ ์ก์์ค ์๋ ์๋ ๊ฑด๋ฐ, ์ด๊ฑธ..
UserDefaults, KeyChain, Core Data
UserDefaults, KeyChain, Core Data
2021.07.23UserDefaults ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ Info.plist ์ ์ ์ฌํ ๊ตฌ์กฐ๋ก ์ ์ฅํ๋ค. UserDefaults.plist๋ ์ฑ ํด๋ ๋ด์ Library ํด๋์ ์ ์ฅ๋๋ค. ์ ์ฅํ ์ ์๋ ํ์ NSString NSNumber NSData NSArray NSDictionary NSData ์ฌ์ฉ์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ค๋ฉด Codable๋ก ๋ง๋ค์ด์ NSData๋ก ๋ณํํด์ ์ ์ฅํ๋ค. ์ต๊ทผ ๊ฒ์ ๋ชฉ๋ก, ์จ๋ณด๋ฉ ์ฌ๋ถ ๋ฑ (๋ณด์์) ๋ฏผ๊ฐํ์ง ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค. ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๊ฒ์ด ์๋๋ค! ์ฑ์ด ์์๋ ๋ UserDefaults.plist ํ์ผ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋๋ค. ๊ทธ๋์ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ UserDefaults์ ์ ์ฅํ๋ฉด ์ฑ ์ฑ๋ฅ์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์๋ค. ์ฌ์ฉ์๊ฐ ํ์๊ธฐ ์ฑ์ ์ฌ์ฉํ์ฌ ์ก..
iOS: ์ค๋์ค ๋
น์, ์ฌ์, ์ ์ฅํ๊ธฐ
iOS: ์ค๋์ค ๋ น์, ์ฌ์, ์ ์ฅํ๊ธฐ
2021.07.06๊ฐ์ AVFoundation์ ์ด์ฉํด์ ์ค๋์ค๋ฅผ ๋
น์, ์ฌ์, ์ ์ฅํด๋ณด์. ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ ์ ๋จผ์ AVFoundation ์์ ์ค์์ ์ธ ๊ฐ์ง ํด๋์ค๋ฅผ ์ดํด๋ณธ๋ค. AVAudioSession AVAudioRecorder AVAudioPlayer AVAudioSession class AVAudioSession: NSObject An audio session acts as an intermediary between your app and the operating system—and, in turn, the underlying audio hardware. ์ค๋์ค ์ธ์
์ ์ฑ๊ณผ ์ด์ ์ฒด์ ์ฌ์ด์ ์ค๊ฐ์ ์ญํ ์ ํ๋ฉฐ ๊ธฐ๋ณธ ์ค๋์ค ํ๋์จ์ด ์ญํ ๋ ํฉ๋๋ค. ๋ชจ๋ iOS, tvOS, watchOS ์ฑ์๋ ๋ค์ ๋์์ผ๋ก..
BOJ: #14889 - ์คํํธ์ ๋งํฌ
BOJ: #14889 - ์คํํธ์ ๋งํฌ
2021.06.18์ ํํ ํ ์๊ฐ ๊ฑธ๋ ค์ ํ์๋ค. ์ ๋ต ์ฝ๋ ํ๋จ์ ์๊ฐ ์ด๊ณผ, ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ ์ฝ๋๋ ๊ฐ์ด ์ฒจ๋ถํ๋ค. ์ผ๋จ, ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฌ์ ๋๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ 2์ฐจ์ ๋ฐฐ์ด๋ก ์ ์ฅํด์ ์๊ธฐ๋ ๋ฌธ์ ์๋ค. ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ ํ์, ๊ตณ์ด ์ ์ฅํ ํ์๊ฐ ์๋ค๋ ๊ฑธ ๊นจ๋ฌ์์ ์ ์ฅํ์ง ์๊ณ , ๋ฐ๋ก ์ ์ ๊ณ์ฐํ๋ ์์ผ๋ก ๋ณ๊ฒฝํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ๋ณ๊ฒฝํ๋ฉด์, ์ง๋ฌธ ๊ฒ์ํ์ ๋ณด๋ ์ ์ฒด ํ์ ์งํฉ์ผ๋ก ๋ง๋ค์ด ๋๊ณ , n / 2์ ์กฐํฉ์ ๊ตฌํ ํ์, ์ฐจ์งํฉ์ ๊ตฌํ๋ ์์ผ๋ก ๋งํฌ ํ์ ๊ตฌํ๋ผ๋ ์ด์ผ๊ธฐ๊ฐ ์์ด์ ๊ทธ๊ฒ๋ ๋ฐ์ํ๋ค. ์ฌ๊ธฐ๊น์ง๊ฐ ์๊ฐ ์ด๊ณผ ๋ ์ฝ๋์๋ค. ๋๋ฌด์ง ํด๊ฒฐ์ฑ
์ ๋ชจ๋ฅด๊ฒ ์ด์, PyPy3๋ก๋ ์คํํด๋ดค๋๋ฐ ์ญ์๋ ์๊ฐ์ด๊ณผ์๋ค. ๋ค๋ฅธ ๊ธ์ ์ฐพ์๋ณด๋ ๋๊ฒ, ์๊ฐ ์ด๊ณผ ๋ ์ฝ๋๋ค์ ์กฐํฉ ๊ตฌํ๋ ํจ์๊ฐ ๋นํจ์จ์ ์ด๋ผ๋ ๋ต๋ณ์ ๋ดค๋ค. ๊ทธ๋..
LeetCode: Generate Parentheses
LeetCode: Generate Parentheses
2021.06.17๋ฐฑํธ๋ํน + ์คํ๊ดํธ๋ฅผ ์กฐํฉํ ๋ฌธ์ ์๋ค. ๋ ๊ฐ์ง ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ ์ฒ๋ฆฌํ๋ค. n๊ฐ์ ๋ชจ๋ ๊ดํธ ์กฐํฉ์ ๋ง๋๋ pick(toPick:) ๋ฌธ์์ด ๋ฐฐ์ด์ด ์ฌ๋ฐ๋ฅธ ๊ดํธ ์กฐํฉ์ธ์ง ํ๋ณํ๋ isWell(_:) ์ค๋ณต์ด ์์๊น๋ด Set์ผ๋ก ์ ์ฅํด์, ์ ๋ ฌํด์ ๋ฐํํ๋ ๊ฑธ๋ก ํด๊ฒฐ. ๋ฌธ์ https://leetcode.com/problems/generate-parentheses ๋ด๊ฐ ์์ฑํ ์ฝ๋ Swift class Solution { func generateParenthesis(_ n: Int) -> [String] { let bracket = ["(", ")"] var result = [[String]]() var picked = [String]() func pick(toPick: Int) { if toPick ==..
iOS: UIMenu ์ฌ์ฉํด๋ณด๊ธฐ
iOS: UIMenu ์ฌ์ฉํด๋ณด๊ธฐ
2021.06.15Apple์ ๋ฏธ๋ฆฌ ์๋ฆผ ์ฑ ํ๋ฉด์ด๋ค. ๋ด๋น๊ฒ์ด์
์ฐ์ธก ์๋จ ๋ฒํผ์ ํญ ํ๋ฉด ํด๋น ์์น์ ๋ฉ๋ด ๋ชฉ๋ก์ด ๋ํ๋๋ค. ์ง๊ธ ํ๊ณ ์๋ ํ๋ก์ ํธ์ ์ด ๋ฉ๋ด๋ฅผ ์ ์ฉํ๊ณ ์ถ์ด์ ์ฐพ์๋ดค๋๋ฐ, ActionSheet๋ฅผ ์ฌ์ฉํ๋ผ๋ ์๊ธฐ๊ฐ ๋ง์๋ค. ๊ทธ๋์ UIAlertController๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ํ๋ ํ๋ฉด์ด ๋์ค์ง ์์๋ค. ์๊ณ ๋ณด๋, UIAlertController(.actionSheet)๋ iPad์์๋ ์์ ๊ฐ์ด, ํญํ ์์น์ ํ์
? ๋ชจ๋ฌ? ํํ๋ก ๋์ค๊ณ , iOS์์๋ ๊ธฐ์กด์ ํํ ์๊ณ ์๋ ์ก์
์ํธ ํํ๋ก ๋์จ๋ค๋๋ผ. ์ ํ์์ ์คํํ์ง๋ ์์ ๊ธฐ๋ฅ์ ์ฐ์ง ์์ ํ
๋ฐ ๋ผ๋ ์๊ฐ์ ํด์ ๊ฐ๋ฐ์ ๋ฌธ์๋ฅผ ๋ค์ ์ฐพ์๋ณด๋, UIMenu๋ผ๊ณ ๋ถ๋ฅธ๋ค๋ ๊ฒ์ ์์๋ค. ์ ..์ ๋ ์นด! var menuItems: [UIAction]..
WWDC2021: Meet async/await in Swift
WWDC2021: Meet async/await in Swift
2021.06.10๊ด์ฌ ์๋ ์ธ์
์ ํ๋์ฉ ๋ณด๊ณ ์๋๋ฐ, ๊ทธ์ค ์ฒซ ๋ฒ์งธ๋ก ์์ฒญํ ๊ฒ์ด "Meet async/await in Swift"๋ค. ์ค๋ฐ๋ถ๊น์ง์ ๋ด์ฉ์ ์ ๋ฆฌํ๋ค. completionHandler๋ฅผ ์ฌ์ฉํ์ ๋์ async/await์ ์ฌ์ฉํ์ ๋๋ฅผ ๋น๊ตํ๋ ๋ด์ฉ์ธ๋ฐ ์ด๊ฒ๋ง ๋ด๋ ์ด๋ ์ ๋ ๊ฐ์ด ์กํ๋ค. ๊ธฐ์กด์๋ completionHandler๋ฅผ ์ด์ฉํด ๋น๋๊ธฐ ์์
์ ์ฒ๋ฆฌํ๋ค. ๋น๋๊ธฐ ์์
์ ํ๋ฉด, ์ค๋ ๋๊ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์
์ ์๋ฃํ ๋๊น์ง ๋ค๋ฅธ ์์
์ ์ํํ ์ ์๋ ์ฅ์ ์ด ์๋ค. ๋ง์ ์ฌ๋๋ค์๊ฒ ์น์ํ ์ ์๋ ์๋ฅผ ์ดํด๋ณด๋ฉด, ํ
์ด๋ธ ๋ทฐ๊ฐ ์๊ณ , ์ฌ๊ธฐ์๋ ์๋ฒ์ ์ ์ฅ๋ ์ธ๋ค์ผ ์ด๋ฏธ์ง๊ฐ ํ์๋๋ค. ์ธ๋ค์ผ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค. ViewModel์์ fetchThumbnail ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค..
RxSwift: UITextField.text์ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ง ๋ชปํ ๋
RxSwift: UITextField.text์ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ง ๋ชปํ ๋
2021.06.02ํ์ฌ ํ๊ณ ์๋ ํ ์ด ํ๋ก์ ํธ์์ ์ฌ์ฉ์์๊ฒ ์ด๋ชจ์ง๋ฅผ ์
๋ ฅ๋ฐ๋๋ค. ์ผ๋ฐ์ ์ธ ํค๋ณด๋๋ก ์
๋ ฅ๋ฐ๋ ๊ฒ์ด ์๋๋ผ ISEmojiView ๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ EmojiViewDelegate๋ฅผ ๊ตฌํํด์ผ ํ๋ค. ๊ทธ์ค์์ ํต์ฌ์ ์ด ๋ถ๋ถ์ด๋ค. // callback when tap a emoji on keyboard func emojiViewDidSelectEmoji(_ emoji: String, emojiView: EmojiView) { textView.insertText(emoji) } ๋๋ ๋ฑ ํ๋์ ์ด๋ชจ์ง๋ง ์
๋ ฅ๋ฐ๊ณ ์ถ์ด์, insertText()๋ฅผ ํธ์ถํ๋ ๋์ ์ emojiField.text = emoji๋ก ๋ณ๊ฒฝํ๋ค. ๊ทธ๋ฐ๋ฐ, ์ฌ๊ธฐ์ ๋ฌธ์ ์ ์ด ์๊ฒผ๋๋ฐ emojiField์ ๋ฐ์ธ๋ ํ P..
RxSwift: Single, Maybe, Completable
RxSwift: Single, Maybe, Completable
2021.06.02Single Single ์ ํน์ํ Observable ์ด๋ค. .success(Value) ์ด๋ฒคํธ ๋๋ .error ์ค ํ ๋ฒ๋ง ๋ด๋ณด๋ผ ์ ์๋ ์ํ์ค๋ฅผ ๋ํ๋ธ๋ค. ๋ด๋ถ์ ์ผ๋ก .success ๋ .next + .completed ๋ก ์ด๋ฃจ์ด์ ธ์๋ค. ์ด๋ฌํ ์ข
๋ฅ์ ํน์ฑ์ ํ์ผ ์ ์ฅ, ํ์ผ ๋ค์ด๋ก๋, ๋์คํฌ์์ ๋ฐ์ดํฐ ๋ก๋ ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ์์ฑํ๋ ๋ชจ๋ ๋น๋๊ธฐ ์์
๊ณผ ๊ฐ์ ์ํฉ์์ ์ ์ฉํ๋ค. ์ฑ๊ณต ์ ์ ํํ ํ๋์ ์์๋ฅผ ๋ด๋ณด๋ด๋ ๋ํ ์์
์ ์ฌ์ฉ๋๋ค. ์ํ์ค์์ ๋จ์ผ ์์๋ฅผ ์ฌ์ฉํ๋ ค๋ ์๋๋ฅผ ๋ ์ ํํํ๊ณ ์ํ์ค๊ฐ ๋ ์ด์์ ์์๋ฅผ ๋ฐฉ์ถํ๋์ง ํ์ธํ๊ธฐ ์ํด ๊ตฌ๋
์ค๋ฅ๊ฐ ๋ฐ์๋๋ค. Maybe Observable์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๋ฉด ๊ฐ์ ๋ฐฉ์ถํ์ง ์์ ์ ์๋ค๋ ์ ์ผํ ์ฐจ์ด์ ์ ์ ์ธํ๊ณ ๋ Single ..
BOJ: #15663 - N๊ณผ M (9)
BOJ: #15663 - N๊ณผ M (9)
2021.05.18๊ฐ์ ์๋ฅผ ๋ฐ๋ณตํด์ ๋ฐฉ๋ฌธํ์ง ์๊ธฐ ์ํด visited๋ก ์ฒดํฌ ์ค๋ณต ์์ด์ ๊ฑฐ๋ฅด๊ธฐ ์ํด Set ํ์
์ผ๋ก ์ ์ฅ ์ค์: String ๋ฐฐ์ด ์ ๋ ฌ์ ์๊ฐ ์ฆ๊ฐํ๋ ์์๊ฐ ์๋! ๋ฐ๋ผ์ ์๊ฐ ์ฆ๊ฐํ๋ ์์๋ก ์ ๋ ฌํ ์ ์๊ฒ ๋ณ๋์ ์ฒ๋ฆฌ๊ฐ ํ์ํจ let sortedResult = result.sorted(by: { $0.localizedStandardCompare($1) == .orderedAscending}) ๋ฌธ์ https://www.acmicpc.net/problem/15663 ๋ด๊ฐ ์์ฑํ ์ฝ๋ Swift import Foundation var fileio = FileIO() let n = fileio.readInt() let m = fileio.readInt() var nums = [Int]() for _ i..
BOJ: #3048 - ๊ฐ๋ฏธ
BOJ: #3048 - ๊ฐ๋ฏธ
2021.05.16๋ ๊ทธ๋ฃน์ ๋ํ ๋, ํํ์ ์ด์ฉํด์ ๋ฐฉํฅ์ ๊ฐ์ด ์ ์ฅํ๋ค. false๋ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ, true๋ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์ด๋ํ๋ ๊ฐ๋ฏธ๋ฅผ ๋ปํ๋ค. ์ฒ์์ ์ด์ค for๋ฌธ์ ์ด์ฉํ๋๋ฐ, ๊ฐ๋ฏธ๋ค์ ์ค์ํ๋ ๊ฒฝ์ฐ i๋ฅผ ํ ๋ฒ ๋ ๊ฑด๋๋ฐ์ด์ผ ํด์ while๋ฌธ์ผ๋ก ๋ณ๊ฒฝํ๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ก ๋ฐฉํฅ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ์ ์ ๋ถ ์ค์ํด์คฌ์๋๋ฐ, 7% ์ฏค์์ ํ๋ ค์ ๋ค๋ฅธ ํ์ด๋ฅผ ์ฐพ์๋ดค๋ค. ์ผ์ชฝ์ผ๋ก ์ด๋ํ๊ณ ์๋ ๊ฐ๋ฏธ๋ ๋ง๋ ๊ฒฝ์ฐ์๋ ๋ฐ๊ฟ์ค ํ์๊ฐ ์๋ค๋ ๊ฑฐ์๋ค. (←, →) ์๋ก ๋ง๋์ง ์์ผ๋๊น! ๊ทธ๋์ ์์ ์๋ ๊ฐ๋ฏธ๊ฐ ์ค๋ฅธ์ชฝ์ ๋ณด๊ณ ์์ ๋ ์กฐ๊ฑด๋ ์ถ๊ฐํ๋ค. ๋ฌธ์ https://www.acmicpc.net/problem/3048 ๋ด๊ฐ ์์ฑํ ์ฝ๋ Swift let n = readLine()!.split(separator: " ")..
BOJ: #1543 - ๋ฌธ์ ๊ฒ์
BOJ: #1543 - ๋ฌธ์ ๊ฒ์
2021.05.16๋ฌธ์์ด์ ์ธ๋ฑ์ค๋ก ์ ๊ทผํ๊ธฐ ์์ subscript๋ฅผ ์ต์คํ
์
์ผ๋ก ๊ตฌํํ๋ค. ํน์ ๋ฌธ์์ด์ ๋ฐฐ์ด๋ก ๋ณํํด์ ํ์ด๋ ๋๋ค. ๋๋ ๋ ๊ฐ์ ์ปค์(๋ฌธ์์ด ์ปค์, ํจํด ์ปค์)๋ฅผ ์ด์ฉํด ํ์๋ค. ๋ฌธ์ https://www.acmicpc.net/problem/1543 ๋ด๊ฐ ์์ฑํ ์ฝ๋ Swift extension String { subscript(offset: Int) -> String { get { let index = String.Index(utf16Offset: offset, in: self) return String(self[index]) } } } let str = readLine()! let pattern = readLine()! let n = str.count let m = pattern.count va..