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

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

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

 

 

코드카타 문제풀이

마라톤 1(Silver 3, 10655번)

문제 내용

 

문제 풀이 방법

체크포인트의 개수 N이 주어지고, 체크포인트의 좌표가 주어질 때, 1번째, 마지막 번째의 체크 포인트를 제외한 체크포인트 중 하나를 건너뛰고 체크포인트를 건너려고 할 때, 체크포인트 1개를 건너뛰고 달릴 수 있는 최소 거리를 출력.

두 좌표 사이의 거리는 택시 거리를 이용해 구한다.

 

 

해결 코드(스포 주의)

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

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val checkpoints = readLine().toInt()
    val checkpointList = mutableListOf<List<Int>>()
    var distance = 0

    for (i in 0 until checkpoints) {
        val (x, y) = readLine().split(" ").map { it.toInt() }
        checkpointList.add(listOf(x, y))
        if (i > 0) {
            distance += manhattanDistance(checkpointList[i-1], listOf(x, y))
        }
    }

    var res = distance
    for (i in 1 until checkpoints - 1) {
        // i번째 좌표를 건너뛰고 이동한 거리.
        val without = distance - (manhattanDistance(checkpointList[i], checkpointList[i+1]) + manhattanDistance(checkpointList[i], checkpointList[i-1])) + manhattanDistance(checkpointList[i-1], checkpointList[i+1])

        res = min(without, res)
    }

    println(res)
}

private fun manhattanDistance(data1: List<Int>, data2: List<Int>): Int {
    return abs(data1[0] - data2[0]) + abs(data1[1] - data2[1])
}

 

풀이 과정

모든 체크포인트를 건너뛰지 않고 돌았을 때의 총거리를 구하기 위한 변수 distance를 생성한다.

체크포인트들의 좌표를 저장할 checkpointList를 생성한다.

 

입력받은 체크포인트들을 checkpointList에 저장하고, i가 0보다 큰 경우에는 i-1번째 체크포인트와 현재 i번째의 체크포인트까지의 거리를 구해 distance에 더해 준다.

 

반복 후 결괏값을 res에 저장한다.

이제 체크포인트 하나를 건너뛰고 난 이동 거리를 구해야 하므로 1부터 checkpoints - 1만큼 반복한다.

이제 i번째 좌표를 건너뛰고 이동한 거리를 계산해서 without에 넣어 주고, without과 res 중 더 작은 값을 res에 대입한다.

 

 

문제 해결 과정

무지성 브루트포스 알고리즘을 사용하면 문제를 풀 수는 있지만 시간 초과가 나기 때문에.

생각을 잘해서 풀어야 하는 문제이다.

 

 

앱 개발 숙련 강의

강의 1주 차

뷰 바인딩

기존에는 레이아웃 파일의 위젯을 불러올 때는 xml과 activity를 연결하기 위해 findViewById를 사용해 불러올 수 있었음.

findViewById를 쓰지 않고 위젯을 연결할 수 있는 방법이 view binding이다.

 

뷰 바인딩은 findViewById보다 편하게 위젯을 연결해 쓸 수 있다.

 

ListView, GridView

어댑터 뷰(Adapter View)

여러 개의 항목을 다양한 형식으로 나열하고 선택할 수 있도록 해주는 기능을 제공하는 뷰.

어댑터 뷰의 종류는 listView, gridView, customView, recyclerView가 있다.

 

어댑터 뷰는 표시할 항목 데이터를 직접 관리하지 않고, 어댑터라는 객체로부터 공급받는다.

리스트 항목을 xml로 구현하고 어댑터를 사용해 리스트 항목을 재사용함으로써 1000개 이상의 항목을 보이게 할 수 있다.

 

 

RecyclerView

recyclerview: listView와 마찬가지로 리스트를 만들 수 있는 뷰.

recycle(재활용) view(뷰) = 뷰를 재활용한다는 뜻이다.

 

리스트뷰와 리사이클러뷰

listView

리스트뷰는 사용자가 스크롤할 때마다 위에 있던 아이템은 삭제되고, 맨 아래의 아이템은 생성되는 것을 반복한다.
아이템이 100개면 100개가 삭제, 생성된다. 계속 삭제와 생성을 반복하기 때문에 성능에는 좋지 못함.

 

recyclerView

사용자가 스크롤할 때, 위에 있던 아이템은 재활용돼서 아래로 이동해서 재사용한다.
아이템이 100개여도 10개 정도의 View만 만들고 10개를 재활용해서 사용한다.
View를 계속 만드는 ListView의 단점을 보완하기 위해 만들어짐.

 

 

Fragment

fragment: 액티비티 위에서 동작하는 모듈화 된 사용자 인터페이스.

fragment는 액티비티와 분리되어 독립적으로 사용됨.

 

fragment를 쓰는 이유

Activity를 대신해서 쓰기 때문에 Activity를 적게 만들 수 있다.
Activity의 복잡도를 줄일 수 있다.
Fragment는 재사용이 가능하다.
Fragment를 사용하면 최소 1개의 Activity안에서 Fragment 공간에 View만 집어넣으면 여러 Activity를 만들지 않아도 여러 화면을 보여줄 수 있다.

 

 


 

오늘 공부 내용 정리 및 회고

오늘부터 팀이 새롭게 바뀌었다. 팀원들이 많이 조용해서 공부하기에는 좋지만 빠르게 친해지기는 힘들 듯하다.

내일은 1주 차 강의를 마무리하고 개인 과제를 시작할 것이다.

728x90