๐ป ๊ฐ๋ฐ/iOS
2022.03.17
๊ณต๋ถํ ๊ฒ ์๋๋ก์ด๋ ๊ฐ์ ์๊ฐ CameraX Glide Content Resolver ScaleGestureDetector ์๊ฒ๋ ๊ฒ 1. AddTextChangedListener ๋๋ถ๋ถ์ ์ดํ๋ฆฌ์ผ์ด์
์์ ๊ฒ์์ฐฝ์ ๊ฒ์์ด๋ฅผ ์
๋ ฅํ๋ฉด ์ฌ์ฉ์๊ฐ Enter ๋ฅผ ๋๋ฅด๊ธฐ๋ ์ ์ ์
๋ ฅํ ๊ฒ์์ด์ ๋ฐ๋ผ ์๋์์ฑ ๊ฒ์์ด๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์ EditText ์ ํ
์คํธ ๋ณํ๋ฅผ ๊ฐ์งํด์ผํ๋๋ฐ ์ด๋ฅผ AddTextChangedListener ๋ฅผ ํตํด ๊ฐ์งํ ์ ์๋ค. private fun bindViews() = with(binding) { editTextView.addTextChangedListener { Log.d("Changed!", editTextView.text.toString()) ..
๐ป ๊ฐ๋ฐ/iOS
2022.03.16
๊ณต๋ถํ ๊ฒ ์๋๋ก์ด๋ ๊ฐ์ ์๊ฐ Retrofit2, OkHttpLoggingInterceptor Shimmer Glide Content Resolver Unsplash API ์๊ฒ๋ ๊ฒ 1. Glide ์ค๋ ๊ณต๋ถ๋ฅผ ํ๋ฉด์ Glide ๊ฐ ์๊ฐ๋ณด๋ค ์์ฒญ ๊ฐ๋ ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๋ ๊ฒ์ ๊นจ๋ฌ์๋ค. Glide ๋ฅผ ์ฌ์ฉํ์ง๋ ๊ฝค ๋์ง๋ง ์ด๋ฅผ ์ ๋๋ก ์ฌ์ฉํ๊ณ ์์ง ์์๋ค. ์ฐ์ ๊ทธ๋์ Glide ๋ฅผ ์ฌ์ฉํ ๋ ์๋์ฒ๋ผ ์จ์๋ค. ๊ทธ๋ฅ ๋จ์ํ ์ด๋ฏธ์ง๋ทฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ฃ์ด์ฃผ๊ธฐ ์ํ ์ฉ๋๋ก... private fun bindViews() { Glide.with(binding.root) .load(profileImageUrl) .into(binding.profileImageView) } ํ์ง๋ง ์ ๋ง ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์์๋ค. ..
๐ป ๊ฐ๋ฐ/iOS
2022.03.15
๊ณต๋ถํ ๊ฒ ์๋๋ก์ด๋ ๊ฐ์ ์๊ฐ ์๊ฒ๋ ๊ฒ 1. OkHttpLogging Retrofit ์ ์ฌ์ฉํด์ API ๋ฅผ ํธ์ถํ ๋ ํด๋ผ์ด์ธํธ์ ๋ฌธ์ ์ธ์ง ์๋ฒ์ ๋ฌธ์ ์ธ์ง๋ฅผ ํ์ธํ๊ธฐ ์ํด HTTP ์ ๋ก๊ทธ๋ฅผ ๋ด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด OkHttp ์ HttpLoggingInterceptor ์ด๋ค. // Retrofit Interface ๋ฅผ ๊ตฌํํ๋ค. private val openApiService : OpenApiService by lazy { Retrofit.Builder() .baseUrl(Url.OPEN_API_BASE_URL) .addConverter(GsonConverterFactory.create()) .client(buildOkHttpClient()) .build() .crea..
๐ป ๊ฐ๋ฐ/iOS
2022.03.14
๊ณต๋ถํ ๊ฒ ์๋๋ก์ด๋ ๊ฐ์ ์๊ฐ ์นด์นด์คํก, ๊ณต๊ณต๋ฐ์ดํฐ API Retrofit, OkHttpLoggingInterceptor FusedLocationProvider Coroutine AppWidgetProvider Service Lifecycle ์๊ฒ๋ ๊ฒ 1. FusedLocationProvider ์๋๋ก์ด๋์์ ์์น ์ ๋ณด๋ฅผ ๋ฐ์์ฌ ์ ์๋ ๋ฐฉ๋ฒ์๋ LocationManager ์ FusedLocationProvider ๊ฐ ์๋ค. ์ฐ์ LocationManager ์ getLastKnownLocation ๋๋ LocationListener ๋ฅผ ํตํด์ ์์น ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. // LocationManager ๋ฅผ ์ ์ํ๋ค. val locationManager = getSystemService(LOCA..
๐ป ๊ฐ๋ฐ/iOS
2022.03.13
๊ณต๋ถํ ๊ฒ ์๋๋ก์ด๋ ๊ฐ์ ์๊ฐ AppWidgetProvider ํ๋ก๊ทธ๋๋จธ์ค 1๋ฌธ์ ์๊ฒ๋ ๊ฒ ์๋๋ก์ด๋ ์์ ฏ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Manifest ์ Recevier ๋ฅผ ๋ฑ๋กํ๊ณ ์ด ๋ action ๊ณผ meta-data ๋ฅผ ๋ฃ์ด์ค๋ค. meta-data : ์์ ฏ ๋ ์ด์์์ ํฌ๊ธฐ, ์ด๊ธฐ ๋ ์ด์์ ๋ฆฌ์์ค, ์
๋ฐ์ดํธ ๋น๋ ๋ฑ ์ฑ ์์ ฏ์ ๊ธฐ๋ณธ์ ์ธ ํน์ฑ์ ์ ์ํ๋ค. minWidth, minHeight : ์์ ฏ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ต์ ํฌ๊ธฐ์ด๋ค. updatePeriodMillis : onUpdate ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ ฏ์ ์
๋ฐ์ดํธํ๋ ๋น๋๋ฅผ ๊ฒฐ์ ํ๋ค. ์
๋ฐ์ดํธ ์์ ๋๋ฐ์ด์ค ๋๊ธฐ๋ชจ๋๊ฐ ํด์ ๋๋ฏ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์๋ ์ต์ 30๋ถ, ์ด๋ณด๋ค ์งง์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์
๋ฐ์ดํธํ๋ ๊ฒ์ ๊ธํ๋ค. previewImage : ์ฑ ์์ ฏ..
โ๏ธ ์ฝํ
์ค๋น/String
2022.03.13
๋ฌธ์ ํ์ด ์ธ์ด Kotlin ์ฝ๋ class Solution { fun solution(record: Array): Array { val history = arrayListOf() val name = mutableMapOf() val result = arrayListOf() for (e in record.iterator()) { val act = e.split(" ") when (act[0]) { "Enter" -> { name[act[1]] = act[2] history.add(Pair(act[0], act[1])) } "Leave" -> { history.add(Pair(act[0], act[1])) } "Change" -> { name[act[1]] = act[2] } } } history.map ..
โ๏ธ ์ฝํ
์ค๋น/Implementation
2022.03.12
์ฐ์ ๊ฐ๋ง์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ์ ํ๋ ํฐ๋ผ ๋ง์ด ์ด๋ ค์ ๋ค. FE / APP ๊ฐ๋ฐ ์ง๊ตฐ์ ์ ํํ๊ณ ์ด 4๋ฌธ์ ๊ฐ ๋์๋๋ฐ DP 1, ๊ตฌํ 1, ๊ทธ๋ํ 2 ์ด๋ ๊ฒ ๋์๋ค. ์ฌ์ ์ด ์์ด์ 30๋ถ ์ ๋ ๋ค๋ฆ๊ฒ ์ฐธ์ํ๊ณ 2์๊ฐ ๋์ 2๋ฒ ํ๋๋ง ํ์๋ค. ์๊ฐ์ด ๋ ์์์ด๋ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ํ์ง ๋ชปํ์ ๊ฒ์ด๋ค. ์๋๋ก์ด๋ ๊ณต๋ถ ๋๋ฌธ์ ์๊ณ ๋ฆฌ์ฆ์ ์ํํ ํ๋๋ฐ ์์ผ๋ก๋ ํธ์ํ์ง ๋ง๊ณ ์๊ณ ๋ฆฌ์ฆ๋ ๊พธ์คํ ํ์ด์ผ๊ฒ ๋ค. ๋ฌธ์ ๋ฌธ์ ์ ์๊ถ์ ์ํด์ ์บก์ณ๋ ํ์ง ๋ชปํ๊ณ ๊ฐ๋จํ๊ฒ ์ค๋ช
ํ์๋ฉด ์ฃผ์ด์ง ๋ฐฐ์ด์ ์ฌ์ ๋ ฌํ๋ ๋ฌธ์ ์๋ค. ์๊ณ ๋ฐฉํฅ, ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ์ด 2๊ฐ์ง์ ๋ฐฉํฅ์ด ์์์ผ๋ฉฐ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ ํ์์ ์ง์๊ฐ ์กด์ฌํ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด 4๊ฐ์ง ๊ฒฝ์ฐ ๋ํด ๋ฐฐ์ด์ ์ฌ์ ๋ ฌํ๋ ๋ฌธ์ ์๋ค. ํ์ด ์ธ์ด Kotlin ์ฝ๋ class Solution ..
โ๏ธ ์ฝํ
์ค๋น/String
2022.03.11
ํ์ด ์ธ์ด Kotlin ์ฝ๋ fun solution(s: String): Int { var minLength = s.length for (i in 0 until s.length / 2) { var subString = s.slice(0..i) var answer = "" var cnt = 1 var last = 0 for (j in i + 1 until s.length - i step i + 1) { // ๋ง์ง๋ง Index ๋ฅผ ์ ์ฅํ๋ค. last = j + i + 1 // ๊ฐ์ SubString ์ธ ๊ฒฝ์ฐ ์ด๋ฅผ ์นด์ดํธํ๋ค. if (subString == s.slice(j..j + i)) cnt += 1 // ๋ค๋ฅธ SubString ์ธ ๊ฒฝ์ฐ else { if (cnt > 1) { // ์ซ์ + SubStri..
๐ป ๊ฐ๋ฐ/iOS
2022.03.10
๊ณต๋ถํ ๊ฒ ์๋๋ก์ด๋ ๊ฐ์ ์๊ฐ ๊นํ๋ธ API Retrofit2 Room SharedPreference ์๊ฒ๋ ๊ฒ ์์์ ์ธํ
ํธ ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ action ๊ณผ category ๋ ํ์ ์์์ด๋ค. ์ธ๋ถ ์คํด ์ ์ด์ฉํ์ฌ ํน์ Url ์ผ ๋ ์กํฐ๋นํฐ๊ฐ ํธ์ถ๋๋๋ก ๊ตฌํํ ์ ์๋ค. ์ธ๋ถ ์ฑ์ ์คํํ๊ณ ๋ค์ ์กํฐ๋นํฐ๋ก ๋์์จ ๊ฒฝ์ฐ onCreate ๊ฐ ์๋ OnNewIntent ๊ฐ ํธ์ถ๋๋ค. Room ์ ์ฌ์ฉํ ๋ Entity ์์ Primary Key ๋ Null ์ด ๋ ์ ์๋ค. (๋น์ฐ) PreferenceManager ๋ฅผ ํตํด ๊ธฐ๊ธฐ ๋ด๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ค. ๊ณต๋ถํ ๊ฒ ์ฝ๋ฃจํด ์ ๋ํด ์์ง ๋ฏธ์ํ๋ค. ๊ณต์ ๋ฌธ์์ ๋ฏธ๋์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ณต๋ถํ์. ๋๋ ์ ๋ฐฐ์ธ๊ฒ ๋๋ฌด ๋ง๋ค. ์ด์ฌํ ์ด์์ผ๊ฒ ๋ค.
โน๏ธ ๋ผ์ดํ/ํ๊ณ
2022.03.05
๋๋์ด ๋ง์ง๋ง ์ผ๊ธฐ! ์ฌ๋ฌ ์ฌ์ง๊ณผ ํจ๊ป ๋ ๋ฌ๊ฐ์ ๋ฏธ๊ตญ ์ํ์์ ๋๋ ์ ์ ์ ์ด๋ณด๋ ค๊ณ ํ๋ค. ์ถ๊ตญ ์ ๋ง์ง๋ง ์ผํ ์ธ๋์ ๋ ํด๋ฆฌ์ค์ ์๋ ์์ธ๋ ์ ๊ฐ๋ค. ํด๋ก์์ ์ ๋ฌผ๋ก ์ค ์ท์ ์ฌ๊ณ ์ด๊ณณ ์ ๊ณณ ๋์๋ค๋
๋ค. ๋ฏธ๊ตญ ์๋
~, ํ๊ตญ ์๋
! ๋ฏธ๊ตญ์ ์์ผ๋ฉด์ ํ๊ตญ ๊ฐ๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๊ตด๋ ๊ฐ์๋๋ฐ ๋ง์ ํ๊ตญ์ผ๋ก ๋์๊ฐ๋ ค๋ ๋ญ๊ฐ ์์ฌ์ ๋ค. ์์นด๊ณ ๋ ๋ด์์ ๋ชป ๊ฐ์ ๊ทธ๋ฐ๊ฑด๊ฐ.. ๐ฅบ ๋ฏธ๊ตญ์ ์ฌ ๊ธฐํ๊ฐ ์๊ธฐ๊ฒ ๋๋ค๋ฉด ๊ทธ ๋ ๋๋์๋ฅผ ๊ผญ ๊ฐ๋ด์ผ๊ฒ ๋ค. ๊ทธ๋์ ์ด๋ ์ด์? ์ ์ ์๊ธฐํ๋ ๊ฒ์ฒ๋ผ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๊ฐ๋ฐ๊ณผ ๋
ผ๋ฌธ์ ๋ชจ๋ ํด๊ฒฐํด์ผ ํ๊ธฐ์ ์๊ฐ๋ณด๋ค ๋ง์ด ๋ฐ์๊ฒ ์์ง์๋ ๋ฏธ๊ตญ ์ํ์ด์๋ค. ๋
ผ๋ฌธ... ์ง์ง ์ด ๋์ ๋
ผ๋ฌธ ๋๋ฌธ์ ๋๋ฆ๋๋ก ์คํธ๋ ์ค๋ฅผ ๋ฐ์๊ณ ๋ด๊ฐ ์๊ฐํ๋ ๋ฏธ๊ตญ ์ํ๊ณผ ์กฐ๊ธ ๋ฌ๋๊ธฐ์ ๋ฏธ๊ตญ์ ์์ ๋๋ 'ํ๊ตญ ..