본문 바로가기
♞ | 공부일지/♝ | TIL

[Android, 내일배움캠프] 공부일지(2024-06-20)

by immgga 2024. 6. 20.
오늘 공부한 내용 정리(2024년 6월 20일)

 

 

코드카타 문제풀이

진법 변환(Bronze 2, 2745번)

문제 내용

 

문제 풀이 방법

B진법 수 N이 주어질 때 N을 10진법으로 변환해서 출력.

 

 

해결 코드(스포 주의)

더보기
import java.io.BufferedReader
import java.io.InputStreamReader

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val (num, decimal) = readLine().split(" ")
    println(num.toInt(decimal.toInt()))
}

 

풀이 과정

num(변경할 수)과 decimal(변환할 진법)을 입력받는다.

num을 decimal 진법으로 변환해서 출력한다.

 

 

문제 해결 과정

toInt()의 파라미터에 수를 입력하면(n) n진법으로 변환된 int로 변경되어 출력된다.

toInt(16): 16진법을 10진법으로 변환한 Int를 출력한다. 이를 이용해 쉽게 문제를 해결했다.

 

 

탑(Gold 5, 2493번)

문제 내용

 

문제 풀이 방법

각 탑의 높이가 주어지고, 탑의 오른쪽에서 왼쪽으로 신호를 송신할 때 높이가 더 높은 탑에서 신호를 받을 수 있다.

신호를 보낸 탑이 몇 번째 탑에서 처음으로 신호를 보낼 수 있는지 출력.

 

 

해결 코드(스포 주의)

더보기
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val case = readLine().toInt()
    val input = StringTokenizer(readLine())
    val tower: Stack<List<Int>> = Stack()     // 탑의 정보(몇 번째 탑인지, 높이가 들어감)
    val resultStr = StringBuilder()     // 출력할 string.

    for (i in 0 until case) {
        val addValue = input.nextToken().toInt()

        while (tower.isNotEmpty()) {
            if (tower.peek()[1] >= addValue) {
                resultStr.append("${tower.peek()[0]} ")
                break
            }
            tower.pop()
        }

        if (tower.isEmpty()) {
            resultStr.append("0 ")
        }
        tower.push(listOf(i+1, addValue))
    }

    println(resultStr)
}

 

풀이 과정

탑의 정보를 저장하는 스택을 생성한다(타입은 list형태인데, 첫 번째 데이터에는 몇 번째 탑인지 알기 위한 수가, 두 번째 데이터에는 입력받은 탑의 높이가 저장된다).탑의 높이가 주어질 때(addValue) tower가 비어있지 않을 때까지 반복한다.만약 tower의 마지막 값이 addValue보다 크면 신호를 받을 수 있으므로 resultStr에 해당 데이터(List)의 첫 번째 데이터를 저장한다. 출력은 처음 수신이 닿는 탑이 몇 번째 탑인지 알아야 하기 때문이다.값이 addValue보다 작은 경우는 그 작은 값을 스택에서 지운다.반복이 종료되고 stack에 값이 들어있지 않으면 0을 resultStr에 저장한다.바깥 반복이 종료되면 resultStr를 출력한다.

 

 

문제 해결 과정

스택의 활용을 잘해야 하는 문제이다.

어떻게 해야 적은 시간으로 스택을 활용해 문제를 풀 수 있을지 생각해야 한다.

문제 이해는 그리 오래 걸리지 않았지만, 나는 stack의 pop을 활용하지 못했기 때문에 시간 초과가 발생했다.

다른 사람의 문제풀이 힌트를 보면서 문제를 어떻게 풀어야 하는지 이해했다.

 

 

안드로이드 앱 개발 입문 개인 과제

주특기 입문 개인 과제

개인 과제 Lv.2

Lv.2는 회원 가입 기능을 구현하는 것이다. 우선 회원 가입 화면을 구성해 주었다(이번에도 역시 XML 코드는 생략한다).

 

이름, 아이디, 비밀번호, 가입 버튼으로 구성된다. 비밀번호는 editText의 inputType를 textPassword를 적용해 비밀번호가 보이지 않게 설정해야 한다.

 

Activity 코드에서는 회원가입 버튼 클릭 이벤트를 생성한다.

editText의 값들이 모두 쓰여 있을 때만 finish()를 수행하고, 아닌 경우는 Toast 메시지를 보이게 하도록 만들었다.

SignUpActivity.ktSignUpActivity.kt

val signUpNameEditText = findViewById<EditText>(R.id.edit_text_sign_up_name)
val signUpIdEditText = findViewById<EditText>(R.id.edit_text_sign_up_id)
val signUpPwEditText = findViewById<EditText>(R.id.edit_text_sign_up_pw)
val signUpCompleteButton = findViewById<Button>(R.id.button_sign_up_completed)

signUpCompleteButton.setOnClickListener {
    if (signUpNameEditText.text.isNotEmpty() && signUpIdEditText.text.isNotEmpty() && signUpPwEditText.text.isNotEmpty()) {
        finish()
    } else {
        Toast.makeText(this, "입력되지 않은 정보가 있습니다", Toast.LENGTH_SHORT).show()
    }
}

 

 

개인 과제 Lv.3

Lv.3의 구현 과제는 홈 화면에 Lv.1 때 구현한 extra를 받아와 id에 보여주는 것과, 종료 버튼을 클릭하면 처음 화면으로 돌아가게 만드는 것이다.

이번에도 홈 화면 UI 구성 먼저 해준다.

 

아이디, 이름, 나이, MBTI를 저장할 Text를 따로따로 만들어주었다(아이디만 따로 만들어줘도 된다).

 

Activity에는 SignInActivity에서 보낸 extra를 불러오는 코드를 생성하고, 종료 버튼 클릭 이벤트를 생성해 activity를 종료할 수 있도록 해주었다.

val extraId = intent.getStringExtra("id")
val homeTextIdValue = findViewById<TextView>(R.id.text_home_id_value)
if (extraId != null) homeTextIdValue.text = extraId

val finishButton = findViewById<Button>(R.id.button_home_finish)
finishButton.setOnClickListener { finish() }

 

 

개인 과제 Lv.4

Lv.4의 원래 이름은 선택 과제이지만, 편의상 Lv.4로 부르겠다.

Lv.4의 과제 내용은 회원가입 후 id와 pw를 signInActivity에 자동으로 불러오도록 만드는 것과 로그인 후 home으로 이동했을 때, 사진 5개를 저장해 놓고 5개를 랜덤으로 돌려서 사진을 띄우는 것을 만들어야 한다.

 

먼저 id와 pw를 로그인 후 자동으로 불러오는 기능을 구현해 보겠다. SignInActivity에 콜백을 만들어 데이터를 불러올 SignUpActivity에 콜백을 등록한 후, 

val intentFromSignUp = Intent(this, SignUpActivity::class.java)
startForResult.launch(intentFromSignUp)

 

SignUpActivity에서 데이터를 저장하고 넘겨줘야 한다. startActivity()를 쓰는 게 아닌 setResult()를 사용한다.

val intent = Intent(this, SignInActivity::class.java)
intent.putExtra("id", signUpIdEditText.text.toString())
intent.putExtra("pw", signUpPwEditText.text.toString())
setResult(RESULT_OK, intent)
finish()

 

로그인 후 5개의 사진 중 1개씩 랜덤으로 뽑혀야 한다.

이를 구현하기 위해 Random(). nextInt(5)를 이용했다.

val homeTitleImage = findViewById<ImageView>(R.id.image_home_title)
val random = Random().nextInt(5)
when (random) {
    0 -> homeTitleImage.setImageResource(R.drawable.image_title_home1)
    1 -> homeTitleImage.setImageResource(R.drawable.image_title_home2)
    2 -> homeTitleImage.setImageResource(R.drawable.image_title_home3)
    3 -> homeTitleImage.setImageResource(R.drawable.image_title_home4)
    4 -> homeTitleImage.setImageResource(R.drawable.image_title_home5)
}

nextInt(5)를 하면 0~4중 숫자가 랜덤으로 뽑힌다.

각 숫자가 무엇이냐에 따라 사진을 설정해서 새로 로그인할 때마다 사진이 바뀌도록 해주었다.

 


 

오늘 공부 내용 정리 및 회고

오늘은 12시간 중 7시간 정도를 개인 과제를 수행하는 데 쓴 것 같다(쉬는 시간 포함).

개인 과제는 완벽하게 마무리했다(요구 사항 모두 구현).

내일은 쭉 알고리즘 공부만 해야겠다.

728x90