간단하게 .count 함수를 이용해서 해결했다.

class Solution {
    fun solution(array: IntArray, height: Int): Int {
        return array.count { it > height }
    }
}

다른 풀이

class Solution {
    fun solution(array: IntArray, height: Int): Int {
        var answer: Int = 0
        for (heights in array) {
            if (heights > height) answer++
        }
        return answer
    }
}

이렇게 for문으로 푸신 분들도 있었고,

class Solution {
    fun solution(array: IntArray, height: Int) = array.filter { it > height }.size
}

이런 풀이도 있는데, filter 함수가 궁금해서 검색해봤다.

 

List<String> 에서의 필터 사용

Filter

dinnerList.filter {
    it.startsWith("P")
}
// [Pizza, Pasta]

먼저 가장 기초가 되는 filter이다. Boolean 값에 따라 필터링을 할지 안 할지 결정한다. 위의 경우에는 “P”로 시작하는 항목만 true이고, 이 값들만 필터링된다.

 

FilterNot

dinnerList.filterNot {
    it == "Pizza"
}
// [Risotto, Pasta, Hamburger]

filterNot은 말 그대로 조건이 아닌 경우에만 남길 때 사용하는 함수이다. 가독성이 걱정될 때 적절히 사용하면 로직을 보기 좋게 정리할 수 있을 것이다.

 

FilterIndexed

dinnerList.filterIndexed { index, s ->
    index == 3
}
// [Hamburger]

인덱스를 통해 처리하고 싶을 때에는 filterIndexed를 통해 인덱스와 값을 각각 받을 수 있다.

 

출처:https://blog.yena.io/studynote/2020/01/22/Kotlin-Collection-Filter.html

 

 

'TIL (Today I Learned) > TIL' 카테고리의 다른 글

2023. 08. 28 TIL  (0) 2023.08.28
2023. 08. 25 TIL  (0) 2023.08.25
2023. 08. 24 TIL  (0) 2023.08.24
2023. 08. 23 TIL  (1) 2023.08.23
2023. 08. 14 TIL  (0) 2023.08.14

문자열 정렬하기(2)

class Solution {
    fun solution(my_string: String): String {
        val lowerCase = my_string.toLowerCase() 
        val answer = lowerCase.toCharArray().sorted().joinToString("") 
        return answer
    }

전에 써봤던 toLowerCase()와 sorted()등을 이용해서 풀 수 있다.

다른사람의 풀이를 보면

class Solution {
    fun solution(my_string: String): String = my_string.lowercase().toCharArray().sorted().joinToString("")
}

이런식으로 간략하게 쓸 수도 있는 것 같다.

 

다이얼로그 

  • AlertDialog클래스를 사용하면 여러 가지 대화 상자 디자인을 빌드할 수 있다.
  • 제목, 콘텐츠 영역, 작업버튼
    • 선택 사항이며 콘텐츠 영역에 상세한 메시지,목록 또는 맞춤 레이아웃이 채워져 있는 경우에만 사용해야합니다.
    • 단순한 메시지 또는 질문을 나타내야 하는 경우 제목은 없어도 됩니다.

보통의 구조

// 기본 다이얼로그
        binding.btn1Alert.setOnClickListener {
            var builder = AlertDialog.Builder(this)
            builder.setTitle("기본 다이얼로그 타이틀")
            builder.setMessage("기본 다이얼로그 메세지")
            builder.setIcon(R.mipmap.ic_launcher)

            // 버튼 클릭시에 무슨 작업을 할 것인가!
            val listener = object : DialogInterface.OnClickListener {
                override fun onClick(p0: DialogInterface?, p1: Int) {
                    when (p1) {
                        DialogInterface.BUTTON_POSITIVE ->
                            binding.tvTitle.text = "BUTTON_POSITIVE"
                        DialogInterface.BUTTON_NEUTRAL ->
                            binding.tvTitle.text = "BUTTON_NEUTRAL"
                        DialogInterface.BUTTON_NEGATIVE ->
                            binding.tvTitle.text = "BUTTON_NEGATIVE"
                    }
                }
            }

            builder.setPositiveButton("Positive", listener)
            builder.setNegativeButton("Negative", listener)
            builder.setNeutralButton("Neutral", listener)

            builder.show()
        }

setTitle 로 타이틀을 작성 , setMessage로 내용을 설명하는 메시지(ex. 예외처리 등), 그 아래 버튼을 배열하고, 기능을 넣어줄 수 있다.

 

// 2. 커스텀 다이얼로그
        binding.btn2Custom.setOnClickListener {
            val builder = AlertDialog.Builder(this)
            builder.setTitle("커스텀 다이얼로그")
            builder.setIcon(R.mipmap.ic_launcher)

            val v1 = layoutInflater.inflate(R.layout.dialog, null)
            builder.setView(v1)

            // p0에 해당 AlertDialog가 들어온다. findViewById를 통해 view를 가져와서 사용
            val listener = DialogInterface.OnClickListener { p0, p1 ->
                val alert = p0 as AlertDialog
                val edit1: EditText? = alert.findViewById<EditText>(R.id.editText)
                val edit2: EditText? = alert.findViewById<EditText>(R.id.editText2)

                binding.tvTitle.text = "이름 : ${edit1?.text}"
                binding.tvTitle.append(" / 나이 : ${edit2?.text}")
            }

            builder.setPositiveButton("확인", listener)
            builder.setNegativeButton("취소", null)

            builder.show()
        }

 커스텀 다이얼로그는 xml에 말그대로 커스텀하여 다이얼로그 화면을 구성하는 것. xml 파일을 따로 작성하는 것이 필요함.

'TIL (Today I Learned) > TIL' 카테고리의 다른 글

2023. 08. 30 TIL  (0) 2023.08.30
2023. 08. 25 TIL  (0) 2023.08.25
2023. 08. 24 TIL  (0) 2023.08.24
2023. 08. 23 TIL  (1) 2023.08.23
2023. 08. 14 TIL  (0) 2023.08.14
  • 오늘 풀어본 알고리즘 문제

이문제는 솔직히 감이 안 와서 GPT에게 질문해서 완성했다.

class Solution {
    fun solution(num: Int, k: Int): Int {
        val numStr = num.toString()
        val digitPosition = numStr.indexOf(k.toString())
        
        return if (digitPosition != -1) digitPosition + 1 else -1
    }
}

 

  • val digitPosition = numStr.indexOf(k.toString()) -> 문자열 numStr에서 문자열로 변환된 정수 k가 처음으로 나타나는 인덱스를 찾는다. 만약 k가 문자열에 존재하지 않으면 -1이 된다.
  • return if (digitPosition != -1) digitPosition + 1 else -1 ==  digitPosition이 -1이 아니라면 (즉, k가 num의 문자열 표현 중에 존재한다면) digitPosition + 1을 반환하고, 그렇지 않으면 -1을 반환한다. 반환값은 k가 나타나는 자릿수를 나타내며, 1부터 시작하는 인덱스를 반환하므로 + 1을 해준다.

다른 풀이로는 

class Solution {
    fun solution(num: Int, k: Int) = "-$num".indexOf(k.toString())
}
  • "-$num": 정수 num을 문자열로 변환하기 위해 앞에 -를 추가한다. 이렇게 하면 음수인 경우도 처리할 수 있다.
  • . indexOf(k.toString()): 변환된 문자열에서 k의 문자열 표현을 찾는다. 만약 k가 발견되면 해당 문자열의 첫 번째 인덱스를 반환하고, 발견되지 않으면 -1을 반환한다.

프래그먼트(Fragment)란?

  • 액티비티 위에서 동작하는 모듈화 된 사용자 인터페이스
    • 액티비티와 분리되어 독립적으로 동작할 수 없음
  • 여러 개의 프래그먼트를 하나의 액티비티에 조합하여 창이 여러 개인 UI를 구축할 수 있으며, 하나의 프래그먼트를 여러 액티비티에서 재 사용할 수 있음

프래그먼트를 사용하는 이유

  • Activity를 적게 만들 수 있다.
  • 복잡도를 줄일 수 있다.
  • 레이아웃을 분리해서 관리가 가능하다.
  • 여러 Activity를 만들지 않아도 여러화면을 보여 줄 수 있다.

프래그먼트의 생명 주기

- CREATED : Fragment의 생명 주기가 CREATED 상태라면 이미 onAttach()를 통해 FragmentManager에 추가된 상태입니다. 이 상태에서 데이터를 초기화, 복구하거나 저장된 상태를 불러옵니다. savedInstanceState가 null이라면 Fragment가 생성되는 것이고 그렇지 않다면 재생성되는 것입니다. 아직 Fragment 안에 선언되어 있는 View들은 생성되지 않습니다.

 

 - STARTED : Fragment안에 있는 View들을 사용할 수 있는 상태입니다. 물론 View들은 non-null일 경우 사용 가능하며, View들의 상태 역시 STARTED 상태가 됩니다.

 

 - RESUMED : Activity와 마찬가지로 사용자와 Fragment가 상호작용하는 단계입니다. 

 

 - STARTED : Fragment의 onPause()를 호출하는 단계이지만 Activity와 다르게 PAUSED가 아닌 STARTED 상태입니다. 사용자로부터 Fragment의 포커스를 잃은 상태입니다. 옵저버에게 ON_PAUSE 이벤트를 내보냄으로써 위에 STARTED와는 차이가 있습니다.

 

 - CREATED : 상태명은 다르지만 Activity와 마찬가지로 더 이상 Fragment가 포그라운드에서 보이지 않게 되는 상태입니다. 옵저버에게 ON_STOP 이벤트를 내보냅니다. onDestroyView()가 호출되면 Fragment의 View들은 detach되며 옵저버에게 ON_DESTROY 이벤트를 내보냅니다. Fragment는 가비지 컬렉터에 의해 제거될 준비를 위해 관련 데이터들은 안전하게 제거되어야 합니다.

 

 - DESTROYED : 앞에서 Fragment 안에 있는 View들이 detach되고 이제 Fragment가 FragmentManager로부터 detach되어 소멸하게 됩니다.

 

출처: https://kumgo1d.tistory.com/76

 

강의를 들어봐도 프래그먼트는 다루기가 어려워서 강의자료에 있던 내용과, 찾아본 자료에서 도움이 될 만한 것들을 모아놓고 계속 복습하려 한다.

 

여러 기능을 배우면서 복잡하고 머리가 어지럽긴 하지만, 나름 재미있고 도전할 맛은 난다.

지금 개인과제들을 진행하고 있는데, 다음주부터는 포스팅에 과제를하며 어려웠던 개념이나 새로 배운점들 위주로 TIL을 작성해 볼까 한다. 

 

어렵다 어려워~

'TIL (Today I Learned) > TIL' 카테고리의 다른 글

2023. 08. 30 TIL  (0) 2023.08.30
2023. 08. 28 TIL  (0) 2023.08.28
2023. 08. 24 TIL  (0) 2023.08.24
2023. 08. 23 TIL  (1) 2023.08.23
2023. 08. 14 TIL  (0) 2023.08.14

오늘 풀어본 알고리즘 문제

배열의 유사도

먼저 for문으로 간단하게 풀어보았다.

class Solution {
    fun solution(s1: Array<String>, s2: Array<String>): Int {
         var count = 0
        
    for (i in s1) {
        if (i in s2) {
            count++
        }
    }

    return count
    }
}

for문으로 돌면서 같은 원소가 있는지 확인하는 방법으로 간단하게 풀렸는데, 다른 사람의 풀이를 보니 이것도 함수로 처리할 수 있는 모양이다.

class Solution {
    fun solution(s1: Array<String>, s2: Array<String>): Int = s1.count { s2.contains(it) }
}

이렇게 간단하게 줄여진다. 

  • s1.count { ... }는 배열 s1의 원소 중 람다식 내의 조건을 만족하는 원소의 개수를 세는 내장 함수입니다.
  • 람다식 { s2.contains(it) }는 배열 s2의 원소 중 현재 원소 it가 포함되어 있는지 여부를 확인하는 조건입니다.

검색 키워드를 어떻게 잡아야 할 지 몰라 GPT를 이용했다. 이럴 때 참 유용한 것 같다.

 

기억해야할 공부 내용

RecyclerView

  • RecyclerView는 한정적인 화면에 많은 데이터를 넣을 수 있는 View.
  • View를 재활용해서 사용.

RecyclerView사용하기

 Adapter

  • Adapter란 데이터 테이블을 목록 형태로 보여주기 위해 사용되는 것.
  • 데이터를 다양한 형식의 리스트 형식을 보여주기 위해서 데이터와 RecyclerView 사이에 존재하는 객체.
  • 데이터와 RecyclerView 사이의 통신을 위한 연결체.

ViewHolder

  • ViewHolder란 화면에 표시될 데이터나 아이템들을 저장하는 역할.
  • ViewHolder의 역할은 RecyclerView의 개념을 적용하기위해 스크롤 해서 위로 올라간 View를 재활용하기 위해서 이 View를 기억하고 있는 것.

 

 

'TIL (Today I Learned) > TIL' 카테고리의 다른 글

2023. 08. 28 TIL  (0) 2023.08.28
2023. 08. 25 TIL  (0) 2023.08.25
2023. 08. 23 TIL  (1) 2023.08.23
2023. 08. 14 TIL  (0) 2023.08.14
2023. 08. 11 TIL  (0) 2023.08.11

+ Recent posts