[내일배움캠프][TIL] 23.12.21 (목) - 둘 만의 암호 (2), 자기소개 앱에 registerForActivityResult 적용시키기
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) 참고로 이 다음에 아이디를 자기소개 페이지에 가져오는 것까지 확인했지만, 그 뒤에 개인 신상이 있기 때문에 동영상으로는 남기지 않았다.