[TIL][내일배움캠프]

[내일배움캠프][TIL] 23.12.21 (목) - 둘 만의 암호 (2), 자기소개 앱에 registerForActivityResult 적용시키기

kimlaurant 2023. 12. 21. 20:10
1. 코드카타

 

오늘은 어제 못 다 풀었던 '둘 만의 암호'를 마저 풀어보겠다.

 

어제 짰던 코드는 아무리 생각해봐도 여기서 더 고칠 만한 부분이 없는데 

거기다 오류가 났으면 거기를 고치면 되는데 이번에는 여러 케이스들 중에서 일부가 오답으로 처리가 된 상황이라 잘못된 점을 찾기가 더더욱 어려웠다.

 

그러다 문득 이런 생각을 해봤다.

 

만약 여기서 뭘 어떻게 보완한다고 해서 해결될 문제가 아니라면?

첫 단추부터 잘못 끼워서 엉켰다면?

 

그리하여 나는 처음부터 다시 만들어보기로 결정했다.

 

 

어제는 'skip이 나오면 그 수를 건너뛰는' 방식으로 했다면 오늘은 'skip에 있는 수를 전부 제외한 상태에서 시작하는' 방식으로 해보고자 한다.

분명 저게 별 차이가 없어보여도 횟수가 많아지면 엄청난 차이가 날 것이 분명하다.

 

우선, skip에 있는 문자들을 전부 제외시키는 코드부터 만들어보자.

var alphabet = ('a'..'z').filter{ it !in skip }.joinToString("")

 

a부터 z까지의 모든 알파벳 중에서 skip에 있지 않은 것들만 뽑아낸 뒤(즉, skip에 있는 알파벳은 제외) 문자열로 다시 합친다.

 

그 다음, 이걸 바탕으로 답을 구해보자.

for(i in s) {
	var afterSkip = (alphabet.indexOf(i)+index)%alphabet.length
	answer += alphabet[afterSkip]
    }

 

afterSkip은 s의 문자열 중 첫번째 단어부터 alphabet 문자열에서 찾은 다음, 그 문자열이 존재하는 인덱스를 index에 더한 값을 alphabet 문자열의 길이로 나눈 나머지다. 그러니까 afterSkip 값은 인덱스의 값이나 마찬가지다.

 

이렇게 하는 이유는 당연 alphabet.indexOf(i) + index 값이 alphabet 문자열의 길이보다 더 클 수 있기 때문이다.

 

그리고 그렇게 나온 인덱스를 alphabet 문자열에서 찾고, 그 알파벳을 answer에 저장한다.

 

이렇게 하나부터 열까지 수정한 코드를 들고 제출했더니 드디어 통과!

 

최종 완성된 코드는 다음과 같다.

class Solution {
    fun solution(s: String, skip: String, index: Int): String {
        var answer: String = ""
        var alphabet = ('a'..'z').filter{ it !in skip }.joinToString("")
        
        for (i in s){
            var afterSkip = (alphabet.indexOf(i)+index)%alphabet.length
            answer += alphabet[afterSkip]
        }
        
        return answer
    }
}

 

 

오늘의 교훈 : 때로는 처음부터 다시 시작하는 것이 더 빠를 때가 있다.

 

 

 

2. Android 앱개발 입문 실습과제 : 자기소개 앱 registerForActivityResult 적용시키기

 

지난 시간에 회원가입 페이지에서 적은 정보를 로그인 페이지에 불러오는 기능을 구현시키기 위해 registerForActivityResult를 배웠다.

이번에는 이 registerForActivityResult를 어떻게 적용시키는지 알아봤다.

 

다음은 SignInActivity(로그인 화면)의 전체 코드이다.

class SignInActivity : AppCompatActivity() {

    private lateinit var resultLauncher: ActivityResultLauncher<Intent>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_signin)

        val idEditText = findViewById<EditText>(R.id.et_id)
        val passwordEditText = findViewById<EditText>(R.id.et_password)
        val btnLogin = findViewById<Button>(R.id.btn_login)
        val btnSignUp = findViewById<Button>(R.id.btn_signup)

        resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
            if (it.resultCode == Activity.RESULT_OK) {
                val idSignUp = it.data?.getStringExtra("id_signup") ?: ""
                val passwordSignUp = it.data?.getStringExtra("password_signup") ?: ""
                idEditText.setText(idSignUp)
                passwordEditText.setText(passwordSignUp)
                }
            }

        btnLogin.setOnClickListener{
            val id = idEditText.text.toString()

            if (idEditText.text.isEmpty() || passwordEditText.text.isEmpty()) {
                Toast.makeText(this, getString(R.string.toast_msg_idpwerr), Toast.LENGTH_SHORT).show()
                return@setOnClickListener
            }

            else Toast.makeText(this, "로그인 성공!", Toast.LENGTH_SHORT).show()

            val intent = Intent(this, HomeActivity::class.java)
            intent.putExtra("id", id)
            startActivity(intent)
        }

        btnSignUp.setOnClickListener{
            val intent = Intent(this, SignUpActivity::class.java)
            resultLauncher.launch(intent)
        }
    }
}

 

여기서 중요한 것은 onCreate() 전에 resultLauncher를 먼저 선언하는 것.

그리고 선언한 resultLauncher를 SignInActivity에 자세하게 설계.

마지막으로, 회원가입 버튼을 누르면 resultLauncher가 가동된다.

 

여기서 RESULT_OK가 바로 암시적 인텐트(Implicit Intent)로써 액티비티가 성공적으로 실행되고 그 결과가 유효하다는 것을 나타낸다.

 

어떻게 registerForActivityResult를 사용해야 하는지 

 

 

그 다음은 SignUpActivity(회원가입 화면) 에서 intent에 들어갈 부분의 코드이다.

val intent = Intent (this@SignUpActivity, SignInActivity::class.java)
intent.putExtra("id_signup", idSignUp)
intent.putExtra("password_signup", passwordSignUp)
setResult(RESULT_OK, intent)

if (!isFinishing) finish()

 

아이디와 패스워드를 받아야하므로 id와 pw를 putExtra하고, 그 밑에 setResult를 적음으로써 완성한다.

 

 

그리하여 나온 결과는 다음과 같다.

 

 

 

아무런 문제 없이 아이디와 비밀번호가 고스란히 로그인 화면으로 전달되었다.

 

다만, UI에는 아무런 문제가 없는데 문제는 컴퓨터 자체 성능이 안 좋아서 그런가 중간에 렉이 너무 자주 걸린다.

일단 구현에는 아무런 문제가 없는 걸 확인했으니 됐다.

 

 

P.S) 참고로 이 다음에 아이디를 자기소개 페이지에 가져오는 것까지 확인했지만, 그 뒤에 개인 신상이 있기 때문에 동영상으로는 남기지 않았다.