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

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

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

 

출처: unsplash.com

 

코드카타 문제풀이

수열의 변화(Bronze 1, 1551번, 마라톤)

문제 내용

 

문제 풀이 방법

수열의 크기와 변환할 횟수가 주어질 때, 위 공식을 이용해 리스트를 변환시켜서 출력한다.

 

 

해결 코드(스포 주의)

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

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val (n, k) = readLine().split(" ").map { it.toInt() }
    var resultList = readLine().split(",").map { it.toInt() }

    for (i in 0 until k) {
        val changeList = mutableListOf<Int>()
        for (j in 0 until resultList.size - 1) {
            changeList.add(resultList[j+1] - resultList[j])
        }

        resultList = changeList
    }

    println(resultList.joinToString(","))
}

 

풀이 과정

리스트의 길이와 변경 횟수를 n, k로 입력받는다.

변경 결과를 저장할 리스트를 생성한다. 초기값은 입력값이다.

 

변경 횟수인 k만큼 반복한다.

변경된 데이터를 저장할 리스트인 changeList를 생성한다.

그다음 기존 리스트인 resultList의 size - 1 만큼 반복하면서 changeList에 문제의 공식을 적용시킨 새로운 리스트를 만들어 준다.

리스트를 생성하면 resultList를 changeList로 갱신해 준다.

반복의 결과를 콤마를 기준으로 나눠서 출력한다.

 

 

문제 해결 과정

간단한 구현 문제였다.

변경된 리스트를 기존의 리스트에 갱신을 해주는 것이 중요하다.

 

 

줄 세우기(SIlver 5, 11536번, 마라톤)

문제 내용

 

문제 풀이 방법

사람의 이름이 리스트로 입력된다.

이름들이 증가하는 순서대로 입력되면 INCREASING, 감소하는 순이면 DECREASING을 출력한다.

두 경우가 아니라면 NEITHER를 출력한다.

 

 

해결 코드(스포 주의)

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

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val case = readLine().toInt()
    val players = Array(case) { "" }

    for (i in 0 until case) {
        players[i] = readLine()
    }

    val checkArray = players.toList()
    players.sortDescending()
    if (checkArray == players.toList()) {
        println("DECREASING")
        return
    }

    players.sort()
    if (checkArray == players.toList()) {
        println("INCREASING")
        return
    }

    println("NEITHER")
}

 

풀이 과정

선수 목록을 players로 입력받아준다.

 

기존 입력된 선수들의 데이터 순서를 저장하기 위해 checkArray를 생성한다.

그다음 players를 sort(), sortDescending()을 수행해 정렬된 players와 checkArray가 순서가 동일한지 확인한다.

정렬 순서가 동일하면 아래의 조건 2개 중 1개를 만족하게 되기 때문에 결과가 출력되고 main 함수가 종료된다.

두 조건 모두 만족하지 않으면 NEITHER를 출력한다.

 

 

 

문제 해결 과정

입력된 리스트와 정렬된 리스트를 비교해 주면 간단하게 해결된다.

 

 

수준별 학습반 5주 차(standard class)

MVVM + LiveData or StateFlow

Fragment의 다양한 data 교환 방식들

bundle을 이용한 방법.

// 동일한 데이터 전달 방법.
arguments = Bundle().apply {
    putString("data", data)
}

arguments.bundleOf("data" to data)

 

 

FragmentResultListener를 이용한 방법

setFragmentResult: 송신, fragment에서 데이터를 보낼 때 사용.

setFragmentResultListener: 수신, 다른 fragment나 activity에서 데이터를 받을 때 사용.

 

Fragment끼리 더 많은 데이터를 공유해야 하거나, 더 자주 서버로부터 끊임없이 공유되어 값이 변경되어야 한다면

그때 MVVM과 LiveData or StateFlow를 써야 한다.

 

더 알아보기: https://pgo-dev.medium.com/fragment-result-api-%EB%8F%99%EC%9D%BC%ED%95%9C-%ED%82%A4%EB%A1%9C-fragment-result-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0-f4b84ba8301b

 

Fragment Result API : 동일한 키로 Fragment result 관리하기

Single Activity 구조가 대두되면서, onActivityResult와 같은 request-result 관계의 Fragment communication 이 요구되었다.

pgo-dev.medium.com

 

 

MVVM + LiveData or StateFlow

대부분의 기업에서 디자인 패턴(MVVM)을 설계하고 적용한 경험이 있는 사람을 원한다.

앱의 기능들이 매우 다양해지고 많아지면서 디자인 패턴 없이 개발하기에는 한계가 있다.

 

하나의 화면에 화면에 필요한 기능을 모두 넣기에는 코드가 매우 복잡해지고, UI를 변경하게 된 경우에는 기존 코드를 갈아엎게 될 가능성도 높다.

그래서 데이터 관리가 매우 중요해지게 됨.

 

MVVM: Model + View + ViewModel

기존에 데이터가 변경되었을 때, 일일이 코드를 변경해야 했던 MVC와는 달리, MVVM은 Model의 데이터가 변경되어도, ViewModel과 View에는 따로 코드를 변경하지 않아도 된다.

 

Model

데이터와 비즈니스 로직 처리

데이터베이스, 네트워크 서비스, 기타 비즈니스 로직

 

View

사용자 인터페이스(UI)

사용자에게 정보를 표시하고 사용자의 입력을 받음.

 

ViewModel

View와 Model 사이의 매개체 역할(Model의 메신저)

View에 데이터를 전달하고, View로부터 입력을 처리한다.

 

 

팀프로젝트

알람 보내기 및 알람 클릭 이벤트 생성

공부 내용 간단 정리

이번에 구현한 내용은 알람을 사용자가 설정한 시간만큼 시간이 지난 후에 알림을 받을 수 있도록 구현하고, 알림을 클릭하면 사용자의 정보를 보여줄 수 있도록 사용자 정보 화면으로 intent 하는 것을 구현했다.

사용자 정보를 보내는 데, intent와 parcelable을 이용했는데, parcelable을 설정한 데이터 클래스의 이름을 수정하면 오류가 발생하는 경우가 있었다(어떻게 해서 해결은 함).

 


 

오늘 공부 내용 정리 및 회고

오늘은 알람을 보내고 알람을 클릭했을 때, 화면 이동까지 할 수 있도록 구현했다.

내일은 연락처 정보 페이지에게 사용자 데이터를 넘기는 기능을 추가해 보겠다.

728x90