타겟 넘버
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
}
}
기존의 데이터를 주고받을때 사용하던 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 개발자
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)
}
}
}
registerForActivityResult
를 resultLauncher
에 넣어주고 결과값의 id
와 password
를 editText
에 넣어주도록 콜백함수를 설정한다.
setResultSignUp()
signUpBtn.setOnClickListener {
val intent = Intent(this, SignUpActivity::class.java)
resultLauncher.launch(intent)
}
setResultSignUp()
함수를 실행하고 회원가입버튼을 누르면 resultLauncher.launch
로 intent
를 전해주고 회원가입 화면으로 이동시킨다.
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()
}
}
회원가입 정보가 모두 입력되어 있으면 putExtra
로 intent
에 데이터를 넣어주고 setResult
로 결과코드와 데이터를 담은 Intent
를 설정해준다.