TIL #57

loci·2024년 6월 26일
0

TIL

목록 보기
55/111
post-custom-banner

타겟 넘버

numbers의 배열이 주어질때 순서를 바꾸지 않고 모두 더하거나 뺐을때 target으로 주어진 수를 만들수있는 방법의 개수를 모두 구해 반환해야한다.

DFS로 구할수 있는 문제인데 아직 DFS를 공부하고는 있지만 어떤 방법인지는 알 것 같은데 정확히 어떻게 쓰고 구현해야할 지 몰라 어려운 느낌이다. 일단 다른사람의 코드를 참고해 하고 있다.


해결 코드

class Solution {
    fun solution(numbers: IntArray, target: Int): Int {
        var answer = dfs(numbers, 0, 0, target)
        return answer
        
        }
    fun dfs(numbers:IntArray, index:Int,sum:Int ,target:Int):Int{
            if(index == numbers.size){
                if(sum == target) {
                    return 1
                } else {
                    return 0
                }
            }
        return dfs(numbers, index+1, sum+numbers[index], target) + dfs(numbers, index+1, sum-numbers[index], target)
    }
        
}

다른사람의 코드

class Solution {
    fun solution(numbers: IntArray, target: Int): Int {
    return numbers.fold(listOf(0)) { list, i ->
        list.run {
            map { it + i } + map { it - i }
        }
    }.count { it == target }
}
}
class Solution {
    fun solution(numbers: IntArray, target: Int): Int {
        var answer = 0
        fun dfs(sum: Int,idx: Int){
            if(idx<numbers.size-1){
                dfs(sum+numbers[idx],idx+1)
                dfs(sum-numbers[idx],idx+1)
            }
            else{
                if(sum+numbers[idx] == target) {answer++}
                if(sum-numbers[idx] == target) {answer++}
            }
        }
        dfs(0,0)
        return answer
    }
}

registerForActivityResult

기존의 데이터를 주고받을때 사용하던 startActivityForResult가 deprecated되고 registerForActivityResult 가 생겼다.
ActivityResultContracts가 생기면서 기존의 문제를 해결했다고 한다.

startActivityForResult는 왜 deprecated 되었는가? (tistory.com)

val getContent = registerForActivityResult(GetContent()) { uri: Uri? ->    
// Handle the returned Uri  
}

사용하려는 activity나 fragment에서 registerForActivityResult함수에 ActivityResultContracts를 어떤 식의 데이터인지에 따라 다르게 설정해주고 콜백을 등록한다. 람다식에는 result로 받아온 값을 어떻게 사용할 것인지 정의해준다.

ActivityResultContracts 명령 | Android 개발자

사용법

SignInActivity.kt
private fun setResultSignUp() {  
    resultLauncher =  
	        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->  
            if (result.resultCode == Activity.RESULT_OK) {  
                val id = result.data?.getStringExtra("id") ?: ""  
                val password = result.data?.getStringExtra("password") ?: ""  
                editTextId.setText(id)  
                editTextPassword.setText(password)  
            }  
  
        }  
}

registerForActivityResultresultLauncher에 넣어주고 결과값의 idpasswordeditText에 넣어주도록 콜백함수를 설정한다.

SignInActivity.kt
setResultSignUp()  
  
signUpBtn.setOnClickListener {  
    val intent = Intent(this, SignUpActivity::class.java)  
    resultLauncher.launch(intent)  
}

setResultSignUp()함수를 실행하고 회원가입버튼을 누르면 resultLauncher.launchintent를 전해주고 회원가입 화면으로 이동시킨다.

SignUpActivity.kt
finishButton.setOnClickListener {  
  
    if (editTextName.text.isEmpty() || editTextId.text.isEmpty() || editTextPassword.text.isEmpty()) {  
        Toast.makeText(this, "입력되지 않은 정보가 있습니다.", Toast.LENGTH_SHORT).show()  
    } else {  
        val intent = Intent(this,SignInActivity::class.java)  
        intent.putExtra("id", editTextId.text.toString())  
        intent.putExtra("password", editTextPassword.text.toString())  
        setResult(RESULT_OK, intent)  
        finish()  
    }  
}

회원가입 정보가 모두 입력되어 있으면 putExtraintent에 데이터를 넣어주고 setResult로 결과코드와 데이터를 담은 Intent를 설정해준다.

profile
편리한 개발자
post-custom-banner

0개의 댓글