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

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

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

 

출처: unsplash.com

 

코드카타 문제풀이

방 배정하기(Bronze 2, 14697번, 마라톤)

문제 내용

 

문제 풀이 방법

방 종류가 3개 주어진다. 한 방에 들어갈 수 있는 학생이 몇 명인지 주어지고(A, B, C) 전체 학생 수(N)가 주어질 때, 방에 빈자리 없이 방을 배정할 수 있는 경우 1을, 그렇지 않으면 0을 출력.

방에 들어갈 수 있는 모든 경우의 수를 체크하면서, 경우의 수들 중 전체 학생 수와 같은 값이 있으면 1을 출력.

 

 

해결 코드(스포 주의)

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

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val (r1, r2, r3, students) = readLine().split(" ").map { it.toInt() }
    var result = 0

    for (i1 in 0 .. students / r1) {
        for (i2 in 0 .. students / r2) {
            for (i3 in 0 .. students / r3) {
                val case = (i1 * r1) + (i2 * r2) + (i3 * r3)
                if (case == students) result = 1
            }
        }
    }

    println(result)
}

 

풀이 과정

방의 종류를 입력받고(r1, r2, r3), 학생 수를 입력받는다(students).

최종적인 결과를 출력할 result 변수를 생성한다. 기본값은 0

 

3중 for문을 돌면서 r1, r2, r3으로 만들 수 있는 모든 경우의 수를 체크한다.

경우의 수들 중 students와 같은 값이 있다면 result를 1로 바꾼다.

 

반복 종료 후 result를 출력한다.

 

 

문제 해결 과정

백준 설탕 배달 문제와 유사하다.

처음에 접근법을 잘못 정하게 되면 고생을 좀 할 수 있는 문제이다.

나누기와 나머지를 이용하는 방법으로 접근을 하면 100점을 맞을 수 없다.

범위도 작아서 모든 경우의 수를 구하는 방법으로 구할 수 있다.

 

 

가지 교배(Bronze 1, 27939번, 마라톤)

문제 내용

 

문제 풀이 방법

조수들에게 가지의 교배를 맡기고 조수들이 교배를 마친 가지들로 키위가 교배를 할 때, 키위가 만들어낼 가지 품종이 흰색이 될 수 있다면 W를 아니면 P를 출력.

조수들이 교배할 때는 P 우선 교배법을 사용하고, 키위가 교배할 때는 W 우선 교배법을 사용한다.

조수들은 P 교배법을 사용한다. 이 뜻은 조수들이 가진 가지들 중 하나라도 P 가지가 있다면 결국 조수가 키위에게 주는 가지는 P가 되는 것이다.

키위는 W 교배법을 사용한다. 이 뜻은 키위가 조수들에게 받은 가지들 중 하나라도 W 가지가 있다면 W 가지를 만들 수 있다.

 

 

해결 코드(스포 주의)

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

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val kind = readLine().toInt()
    val eggPlantKinds = readLine().split(" ")
    val (assistant, assistantKind) = readLine().split(" ").map { it.toInt() }
    val resultEggPlant = mutableListOf<String>()

    for (i in 0 until assistant) {
        val eggPlants = readLine().split(" ").map { eggPlantKinds[it.toInt() - 1] }
        if (eggPlants.contains("P")) resultEggPlant.add("P")
        else resultEggPlant.add("W")
    }

    if (resultEggPlant.contains("W")) println("W")
    else println("P")
}

 

풀이 과정

품종의 종류표를 입력받는다(eggPlantKinds). kind는 만들어 놓았지만 쓰지는 않는다.

조수가 몇 명인지 입력받는 변수 assistant와 받는 가지의 개수(assistantKind)를 입력받는다.

최종적으로 키위에게 갈 가지들의 품종을 resultEggPlant에 저장한다.

 

조수들이 받는 가지가 무엇인지 입력받는다(eggPlants).

조수들은 P 교배법을 쓰기 때문에 eggPlants에 P가 하나라도 있으면 resultEggPlant에 P를 추가하고, 그렇지 않으면 W를 추가한다.

 

최종적인 키위의 교배는 W 교배법을 쓰기 때문에, resultEggPlant에 W가 하나라도 있다면 W 가지를 만들 수 있다.

위 조건을 만족하면 W를 출력하고, 그렇지 않으면 P를 출력한다.

 

 

문제 해결 과정

문제 해석에 더 시간이 오래 걸린 문제이다. 그거 말고는 구현이 어렵다거나 그렇지는 않았다.

 

 

내일배움캠프 강의 수강

수준별 학습반 강의 3주 차(standard class)

RecyclerView

recyclerView 추가 이전의 초기의 리스트 방법

ListView, GridView

리스트가 생성되고 나서 화면에 보이게 되는 데이터를 생성하고, 보이지 않게 되면 데이터를 삭제한다.
create, destroy를 반복하다 보니 성능이 떨어지게 되었다.

 

무한한 스크롤이 필요한 앱이 등장하게 되면서 ListView와 GridView의 한계가 드러나기 시작해서 이를 대체하기 위한 리스트인 RecyclerView가 등장하게 되었다.

 

RecyclerView는

리스트를 스크롤할 때, 화면에 보이지 않게 되는 리스트는 재활용되어 화면에 보이게 되는 리스트로 다시 사용하게 된다.
그렇게 되면 초기에 생성된 10~20개 이내의 데이터를 무한히 재사용해 효율적이다.

 

 

RecyclerView를 사용하려면

LayoutManager: RecyclerView 내부의 아이템들이 어떻게 배치될지 결정한다.

horizontal, grid, staggerd, mixed의 방법이 존재한다.

 

Adapter: RecyclerView와 데이터를 보여줄 ViewHolder를 연결해 준다.

데이터를 RecyclerView에 연결한다.

 

ViewHolder: RecyclerView의 아이템의 개별 관리를 위한 객체이다.

아이템의 모든 정보를 관리, 수정할 수 있다.

 

 

앱 개발 숙련 강의 1주 차(2)

Fragment의 데이터 전달.

앞으로 프로젝트를 진행하다 보면 fragment들끼리 데이터를 전달해야 하는 일이 자주 있을 것이다.

Activity와 Fragment 간의 데이터 전달도 가능하고, Fragment들끼리의 전달도 가능하다.

 

Activity에서 Fragment로 데이터 전달.

데이터 전달에 intent를 쓰지 않고 bundle을 이용해 전달한다.

Bundle에 원하는 데이터 타입을 집어넣어서 fragment로 보내면 된다. key와 데이터를 같이.

fragment에서는 들어온 데이터를 arguments를 이용해 불러온다. key를 불러오면 됨.

 

 

Dialog

Dialog(대화 상자): 사용자에게 결정을 내리거나 추가정보를 입력하라는 메시지를 표시하는 직은 창.

기본적으로는 화면을 가득 채우지는 않는다. 보통은 사용자가 다음으로 계속 진행하기 전에 조치를 취해야 하는 모달 이벤트에 사용.

 

다이얼로그의 구조

제목(title): 다이얼로그의 제목 영역

콘텐츠 영역(content): 메시지, 목록 등 다른 맞춤 레이아웃을 표시.

작업 버튼: 대화 상자 하나에 작업 버튼 3개를 초과할 수는 없다.

 

다이얼로그는 xml에 따로 뷰를 추가해서 작업하는 게 아닌, 코드로 구현해야 함.

 

 

알림

알림(Notification): 앱의 UI와 별도로 사용자에게 앱과 관련한 정보를 보여주는 기능.

Android 8.0 이상부터는 알림 채널을 만들어야 한다.

 

알림 생성

NotificationCompat.Builder 객체에서 알림에 대한 UI 정보와 작업을 지정한다.

setSmallIcon(): 작은 아이콘
setContentTitle(): 알림 제목
setContentText(): 알림 텍스트

 

NotificationCompat.Builder.build() 호출

NotificationManagerCompate.nofify()를 호출해서 시스템에 Notification 객체를 전달.

 

 

개인 공부

앱 개발 숙련 개인 과제

공부 내용 간단 정리

오늘 막 시작했다.

그래서 간단하게 과제에 쓸 아이콘들을 넣어 주었고, 상품의 데이터를 저장하기 위한 데이터 클래스를 만들어 주었다.

data class GoodsData(
    val title: String,
    val address: String,
    val price: Int,
    val goodsImage: Int,
    val chatCnt: Int,
    val likeCnt: Int
)

 

나중에 추가해야 할 것이 있으면 추가하겠다.

마지막으로 메인 화면의 UI 구성을 해주었다. Toolbar와 RecyclerView로만 구성된 간단한 화면이었다.

 


 

오늘 공부 내용 정리 및 회고

오늘은 수준별 학습반 강의를 듣고, 개인 과제를 시작했다.

물론 그전에 1주 차 강의를 완강하는 것도 잊지 않았다.

내일부터 쭉 달려서 과제 필수 구현까지 끝낼 생각이다.

728x90