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

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

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

 

 

코드카타 문제풀이

신나는 함수 실행(Silver 2, 9184번)

문제 내용

 

문제 풀이 방법

재귀 함수 w를 수행했을 때, 함수의 결과를 출력. 입력은 a, b, c 모두가 -1일 때까지 입력받는다.

 

 

해결 코드(스포 주의)

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

private val dp = Array(21) { Array(21) { Array(21) { 0 } } }

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    while (true) {
        val (a, b, c) = readLine().split(" ").map { it.toInt() }
        if (a == -1 && b == -1 && c == -1) break
        else println("w($a, $b, $c) = ${w(a, b, c)}")
    }
}

private fun w(a: Int, b: Int, c: Int): Int {
    return if (a <= 0 || b <= 0 || c <= 0) 1
    else if (a > 20 || b > 20 || c > 20) w(20, 20, 20)
    else if (dp[a][b][c] != 0) {
        // 기존 데이터 재사용.
        return dp[a][b][c]
    } else if (a < b && b < c) {
        dp[a][b][c] = w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c)
        return dp[a][b][c]
    } else {
        dp[a][b][c] = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
        return dp[a][b][c]
    }
}

 

풀이 과정

a, b, c가 -1일 때까지 반복해야 하므로 무한 반복을 돌려준다.

a, b, c를 입력받고 함수 w를 수행해 준다.

 

문제의 형식에 맞게 w 함수를 구성해 준다.

하지만 그냥 w 함수만 수행하면 시간 초과가 나기 때문에 dp를 사용해야 한다.

재귀 데이터를 저장한 3중 배열 dp를 생성해 주고,

3, 4번째 조건에 dp 값에 결괏값을 대입해 준다.

a, b, c번째 index에 해당하는 dp값이 있으면 굳이 재귀를 돌 필요가 없으므로 그냥 dp값을 return 해 주면 시간을 절약할 수 있다.

 

w() 함수를 수행하고 나서 형식에 맞게 정확하게 출력을 해주면 된다.

 

 

문제 해결 과정

평범한 재귀 문제는 아니다. dp를 재귀에 섞어 주어야 시간 초과가 나지 않는다.

 

 

아스키 도형(Silver 1, 3495번)

문제 내용

 

문제 풀이 방법

슬래시와 콤마로 이루어진 h x w 크기의 배열이 주어질 때, 그린 도형의 넓이를 출력.

콤마의 넓이는 1이고, 슬래시의 넓이는 0.5이다.

 

 

해결 코드(스포 주의)

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

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val (mapX, mapY) = readLine().split(" ").map { it.toInt() }
    var slashCnt = 0
    var commaCnt = 0

    for (i in 0 until mapX) {
        val input = readLine()
        var slashStart = -1
        var slashEnd = -1
        var commaAdd = 0

        // 입력값에 콤마가 존재하는 경우.
        if (input.contains(".")) {
            for (j in input.indices) {
                if (input[j] == '\\' || input[j] == '/') {
                    // slash의 시작점이 -1이면 시작점을 설정
                    if (slashStart == -1) slashStart = j
                    else {
                        if (slashEnd == -1) {
                            // 종료점이 -1이면 종료점 적용 및 안에 들어 있던 comma의 개수를 더함.
                            slashEnd = j
                            commaCnt += commaAdd
                            commaAdd = 0
                        } else {
                            // 종료점이 -1이 아니면 새롭게 시작점을 설정해야 한다.
                            // 시작점을 변경 해주고 종료점을 -1로 변경.
                            slashStart = j
                            slashEnd = -1
                            commaAdd = 0
                        }
                    }
                    slashCnt++
                } else {
                    // input[j]가 slash가 아니면 comma라는 뜻.
                    // 시작점이 -1이 아니면 commaAdd를 증가시키기.
                    if (slashStart != -1) commaAdd++
                }
            }
        }
        // 입력값에 콤마가 존재하지 않으면 slash만 존재한다는 뜻.
        else slashCnt += input.length
    }

    println(slashCnt / 2 + commaCnt)
}

 

풀이 과정

맵의 크기를 저장할 mapX, mapY를 생성해 준다.

0부터 mapX까지 반복한다.

 

입력값(input)과 슬래시 기호의 시작 index를 저장할 slashStart, 슬래시 기호의 종료점을 저장할 slashEnd, 추가할 콤마의 개수를 commaAdd로 저장한다.

input이 슬래시들로만 이루어져 있으면, slashCnt에 input의 길이만큼을 더해 준다.

아닌 경우에는 slashStart, slashEnd를 설정해 주어야 한다.

초기에 slashStart가 -1인 경우에는 slashStart를 j로 설정해 주고 slashEnd는 slashStart가 초기화된 경우에만 초기화를 할 수 있도록 한다.

두 변수 모두 초기화되어 있으면 2개의 슬래시를 지났다는 뜻이므로 시작점을 다시 설정해 주어야 한다. 도착점은 -1로 초기화해 주고, commaAdd도 0으로 초기화한다.

그리고 slashCnt를 증가시킨다.

 

저장된 slashCnt / 2 + commaCnt를 출력한다.

 

 

문제 해결 과정

기하학 문제이지만 개수를 세서 수학으로 풀 수 있는 문제이다.

도형을 구성하는 데 필요한 대각선의 개수에 2를 나눈 값에 슬래시 안에 있는 콤마의 개수를 더해 주면 값을 쉽게 구할 수 있다.

 

 

앱 개발 입문 발표회

앱 개발 입문 프로젝트 발표회

활동 내용 간단 정리

다른 조와 우리 조의 프로젝트를 발표했다.

우리 조는 카페 메뉴 추천으로 아이디어를 정했는데 이를 구현하기 위해 굳이 로그인 / 회원가입이 필요한가? 에 대한 지적을 받고, 시연 영상을 설명 없이 보여 준 것에 대한 지적을 받았지만

프로젝트를 구상할 때, 주어진 기능을 사용하기 위한 아이디어를 짜야한다는 것을 배우게 되었다.

 

 

개인 공부

수준별 학습반 과제 2주 차

공부 내용 간단 정리

플레이 스토어의 검색 기능을 구현함.

검색 기능에는 검색 완료 여부와 editText 포커스 여부에 따라 더미 데이터 scrollView의 visibility를 설정해 주었다.

링크들을 모두 object에 넣어서 전역에서 사용할 수 있도록 해주었다.

모든 더미 앱들을 클릭했을 때 play store에 해당 앱으로 이동할 수 있게 intent 처리를 해주었다.

 

구현 영상

 

 

 


 

오늘 공부 내용 정리 및 회고

입문 주차가 모두 마무리되었다.

팀 프로젝트 발표회를 하면서 현재 부족한 점을 알 수 있었다.

그리고 수준별 학습반의 개인 과제를 모두 완료했다. 노가다는 정말 귀찮다.

728x90