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

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

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

 

 

코드카타 문제풀이

절댓값 힙(Silver 1, 11286번)

문제 내용

 

문제 풀이 방법

데이터를 입력받다가 리스트에서 절댓값이 가장 작은 값들 중 원본 값이 가장 작은 값을 리스트에서 제거한다. 리스트가 비어있으면 0을 출력.

 

 

해결 코드(스포 주의)

더보기
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*
import kotlin.math.abs

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val numbers = readLine().toInt()
    // o1, o2를 절댓값으로 비교 후 같으면 더 작은 수가 우선순위, 다르면 절댓값이 더 작은 순으로 정렬한다.
    val priorityQueue = PriorityQueue<Int> { o1, o2 ->
        if (abs(o1) == abs(o2)) o1 - o2 else abs(o1) - abs(o2)
    }
    val printValue = StringBuilder()

    for (i in 0 until numbers) {
        val number = readLine().toInt()
        if (number == 0) {
            if (priorityQueue.isEmpty()) printValue.append(0).append("\n")
            else printValue.append(priorityQueue.poll()).append("\n")
        } else priorityQueue.offer(number)
    }

    println(printValue)
}

 

풀이 과정

특수한 우선순위 기준을 설정한 우선순위 큐를 생성해 주었다.(priorityQueue) 반복문에서 number를 입력받고, number가 0일 때 큐가 비어 있으면 0을 출력하고, 아닌 경우에는 큐에서 절댓값이 가장 작은 수들 중 원본 데이터의 값이 가장 작은 값을 출력한다.

 

 

문제 해결 과정

우선순위 큐의 우선순위 정렬 기준을 잘 정의하면 최대 힙, 최소 힙과 다를 게 없는 문제지만, 우선순위 큐의 정렬 기준은 오름차순, 내림차순만 있는 것으로 알고 있었다.

평범하게 우선순위 큐를 사용해 정렬되지 않은 큐 데이터를 직접 최솟값을 가져오고, 특정 위치에 있는 최솟값을 제거하려 하다 보니 시간 초과가 발생했다.

우선순위 큐를 더 공부해 보았는데, 초기의 우선순위 설정을 오름차순, 내림차순만 할 수 있는 게 아니고 자신이 직접 우선순위를 정의할 수 있다는 것을 알았다(문제 접근 방법을 봐서 알게 되었다).

내가 정의한 우선순위 설정은 절댓값이 같은 경우는 더 작은 값이 먼저 오도록 설정하고 아닌 경우는 절댓값이 더 작은 값이 우선적으로 앞으로 오도록 설정했다.

우선순위 큐 문제를 몇 개 풀어보면 완벽히 우선순위 설정을 마스터할 것 같다.

 

 

안드로이드 앱 개발 강의 수강

안드로이드 앱 개발 입문 3주 차

Android UI - Widget

뷰(View)

안드로이드 앱의 UI를 구성하는 기본 단위.

 

뷰는 위젯과 레이아웃으로 구성된다.

위젯(Widget): View의 서브 클래스로서, 앱 화면을 구성하는 시각적인 모양을 지닌 UI요소(버튼, 텍스트)
레이아웃(Layout): ViewGroup의 서브 클래스, 다른 뷰를 포함하면서 이들을 정렬하는 기능을 가진다.

 

안드로이드의 UI를 설계하기 위해서는 Android Studio의 layout editor를 이용해 직접 뷰를 화면에 끌어서 사용하거나,

XML을 직접 편집하는 방법을 쓸 수 있다.

 

Android Dp(Dip), Px, Dpi의 개념.

Px는 화면의 전체 화면 크기와 상관없이 지정한 수치만큼 표시되는 절재적 표시 단위
Dp(Density-independentPixel): 밀 ㅗ 또는 독립 화소를 말하면, 디스플레이의 해상도(밀도)와 상관없이 다룰 수 있는 범위
Dpi(dotsperinch)는 DotPerinch로 1인치에 들어가는 픽셀을 나타내는 단위이다. 예를 들면 100 DPI는 1인치당 100픽셀이 포함된다는 뜻이다.

 

 

Android UI - Layout

레이아웃(Layout)

ViewGroup의 파생 클래스로서, 포함된 View를 정렬하는 기능이 있다.

 

레이아웃의 종류로는 LinearLayout, RelativeLayout, TableLayout, FrameLayout, ConstraintLayout이 있다.

 

LinearLayout이란:

하위 뷰들을 수평(horizontal), 수직(vertical)으로 정렬할 수 있다.

 

RelativeLayout이란:

뷰를 서로 간의 위치 관계나 컨테이너의 위치 관계를 지정한다.

 

TableLayout이란:

뷰를 표 형식으로 배치하고자 함.

 

FrameLayout이란:

한 장의 프레임 위에다가 위젯을 넣을 때 사용된다.

 

ConstraintLayout이란:

재약 조건을 생성해 화면을 그린다.복잡한 구조를 단순한 계층 구조로 표현 가능뷰의 비율을 조정할 수 있다(LinearLayout에서만 가능했음).거의 모든 layout의 기능을 쓸 수 있다고 생각하면 됨.

 

 

안드로이드 앱 개발 입문 4주 차

Activity

Activity란?

안드로이드 애플리케이션의 핵심 구성 요소로서 사용자가 직접 상호 작용하는 창(window)을 의미한다.

 

상호 작용의 예

액티비티는 사용자가 전화를 거는 화면, 사진을 찍는 인터페이스, 이메일을 보내거나 지도를 확인하는 등의 다양한 기능을 수행할 때마다 등장한다.

 

UI 구성

각각의 액티비티는 하나의 창을 가지며, 이 창에는 뷰(View)라 불리는 객체들을 통해 사용자 인터베이스가 구성된다.

 

애플리케이션의 시작

모든 안드로이드 애플리케이션은 최소 1개 이상의 액티비티를 포함하고 있으며, 앱이 시작될 때 시스템은 지정된 메인 액티비티를 실행하여 사용자에게 첫 화면을 보여준다.

 

 

Intent(인텐트)

Intent란?

Activity 간 화면 전환이 가능하게 하는 메시지 객체

 

intent의 종류

명시적 intent(Explicit Intent): 특정한 컴포넌트를 직접 호출할 때 사용.

암시적 intent(Implicit Intent): 특정한 컴포넌트를 명시하지 않고, 수행하고자 하는 일반적인 작업을 intent 객체에 설정해 startActivity()에 넘기는 것

 

intent로 데이터 전달하기

복잡한 데이터를 intent에 전달하기 위한 key-value 쌍의 추가 정보이다.

전달받은 Activity에서 key를 설정해 사용할 수 있다.

 

Activity의 생명주기

액티비티의 수명은 onCreate()가 실행되었을 때 시작되고, onDestroy()가 호출되면 끝난다.

액티비티가 화면에 보이기 시작할 때는 onStart()가 호출되고, 화면에 보이지 않게 되는 시점은 onStop()이 수행된 이후이다.

액티비티가 foreground에서 동작하기 시작하는 시점이 onResume()가 호출된 이후이고, foreground에서 동작이 종료되면 onPause() 상태가 된다.

 

개인 공부

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

주특기 입문 개인 과제(Lv.1)

Lv.1의 과제 내용은 로그인 UI를 구성하고 로그인, 회원가입 버튼의 예외 처리를 만드는 것이다.과제 내용과 최대한 비슷하게 UI를 구현해 주었다(코드를 첨부하면 포스팅이 너무 길어지기 때문에 사진만 첨부한다).

activity_sign_in.xml

 

그리고 로그인 버튼(button_login)과 회원가입 버튼(button_sign_up)의 예외 처리를 해준다.

 

SigninActivity.kt

val idEditText = findViewById<EditText>(R.id.edit_text_id)
val pwEditText = findViewById<EditText>(R.id.edit_text_pw)
val loginButton = findViewById<Button>(R.id.button_login)
val signUpButton = findViewById<Button>(R.id.button_sign_up)

loginButton.setOnClickListener {
    // id, pw 중 하나라도 비어 있으면 작동.
    if (idEditText.text.isNotBlank() && pwEditText.text.isNotBlank()) {
        val intent = Intent(this, HomeActivity::class.java)
        intent.putExtra("id", idEditText.text ?: "null")
        startActivity(intent)
        Toast.makeText(this, "로그인 성공", Toast.LENGTH_SHORT).show()
    } else {
        Toast.makeText(this, "아이디/비밀번호를 확인해주세요.", Toast.LENGTH_SHORT).show()
    }
}

signUpButton.setOnClickListener {
    startActivity(Intent(this, SignUpActivity::class.java))
}

editText, Button을 모두 findViewById로 불러온다.id 또는 pw가 비어있는지 확인 후 둘 다 비어있지 않으면 key를 id로 설정하고, value를 idEditText의 text를 불러와 HomeActivity로 넘긴다.signUpButton을 클릭했을 때는 별도의 예외 처리 없이 회원가입 화면으로 넘긴다.

 


 

오늘 공부 내용 정리 및 회고

오늘은 강의 듣는데 시간을 은근히 많이 소비했다. 작성해야 하는 내용을 최대한 간단히 작성하고 싶은데 잘 안된다. 쓰다 보면 늘겠지.

본격적으로 주특기 입문 개인 과제를 시작했다. 내일 하루종일 하면 모두 끝낼 수 있을 것 같다.

알고리즘은 주특기 입문 과제를 끝내고 남은 시간에 좀 해볼 생각이다.

728x90