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

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

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

 

 

코드카타 문제풀이

🍎📦 '사과상자'에 들어있는 것은 무엇? 현금?(Bronze 1, 29724번, 마라톤)

문제 내용

문제 내용이 너무 길어서 입출력 부분만 캡처했다. 문제의 본문을 보고 싶다면 아래 링크.

https://www.acmicpc.net/problem/29724

 

문제 풀이 방법

상자의 수(N)가 주어지고, 바로 다음에 상자의 종류(T)와 상자의 가로(W), 높이(H), 세로(L)가 주어질 때, T가 A인 상자에 들어갈 수 있는 사과의 값어치와 상자의 총질량을 출력.

사과의 질량은 1개당 500g이고, 배는 1박스에 120g짜리의 배즙 50개가 고정적으로 들어간다.

사과 1개의 크기는 12 x 12 x 12의 정육면체이다.

사과 1개의 가격은 4000원이다.

 

 

해결 코드(스포 주의)

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

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val fruitBoxCnt = readLine().toInt()

    var weight = 0          // 총 상자의 무게
    var boxInAppleCnt = 0   // 사과의 총 개수

    for (i in 0 until fruitBoxCnt) {
        val box = readLine().split(" ")
        val fruitKind = box[0]
        val width = box[1].toInt()
        val height = box[2].toInt()
        val length = box[3].toInt()

        // 12 * 12 * 12cm: 사과의 크기
        when(fruitKind) {
            "A" -> {
                val apples = (width / 12) * (height / 12) * (length / 12)
                boxInAppleCnt += apples
                weight += 1000 + (apples * 500)
            }
            "B" -> weight += 6000
        }
    }

    // 사과 1개: 4000원
    println(weight)
    println(boxInAppleCnt * 4000)
}

 

풀이 과정

상자의 개수(fruitBoxCnt) 만큼 반복해서 상자의 정보를 받아온다.

fruitKind(상자의 종류), width, height, length를 받아 온다.

fruitKind를 체크해 B(배즙 상자)인 경우 상자의 크기가 어떻든 120g의 배즙 50개가 들어간다. 그래서 6000g 고정.

A(사과 상자)인 경우 width, height, length에 각각 사과 하나의 크기를 나눠서 몇 개의 사과가 들어가는지 체크한다.

예를 들어 30 x 15 x 15의 상자의 경우 각각의 수를 12로 나눠서 곱해주면 2 * 1 * 1이 돼서 2개의 사과를 넣을 수 있다.

 

반복 종료 후, 총 무게(weight)와 사과의 총금액(boxInAppleCnt * 4000)을 출력한다.

 

 

문제 해결 과정

A박스에 사과가 총 몇 개 들어가는지 알 수 있으면 쉽다.

 

 

행복 점수(Bronze 1, 30445번)

문제 내용

문제의 본문 링크

https://www.acmicpc.net/problem/30445

 

문제 풀이 방법

문자열이 주어질 때, 행복 점수를 출력.

행복 점수는 행복한 글자와 우울한 글자의 개수로 구할 수 있다. 행복한 글자는 H, A, P, Y이고, 불행한 글자는 S, A, D이다.

A의 경우에는 행복 지수와 우울 지수를 모두 증가시킨다.

만약 행복한 글자의 수와 우울한 글자의 개수가 0개이면 행복 지수는 0.5 고정이다.

 

 

해결 코드(스포 주의)

더보기
import java.io.BufferedReader
import java.io.InputStreamReader
import java.math.BigDecimal
import java.math.RoundingMode

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val string = readLine().split(" ")

    // sad, happy
    var sadCnt = 0
    var happyCnt = 0
    for (s in string) {
        for (c in s) {
            when(c) {
                'S' -> sadCnt++
                'A' -> {
                    sadCnt++
                    happyCnt++
                }
                'D' -> sadCnt++
                'H' -> happyCnt++
                'P' -> happyCnt++
                'Y' -> happyCnt++
            }
        }
    }

    if (happyCnt == 0 && sadCnt == 0) {
        println("50.00")
    } else {
        val percentage: BigDecimal = (happyCnt / (happyCnt + sadCnt).toDouble() * 100).toBigDecimal()
        println(percentage.setScale(2, RoundingMode.HALF_UP))
    }
}

 

풀이 과정

입력받은 문자열을 공백을 기준으로 나눠준다(string).

string을 for문으로 반복하고 분할된 문자열을 다시 for문을 돌려 char 하나하나 체크해 준다.

 

행복한 글자인지 우울한 글자인지 체크해서 각각의 카운트를 증가시킨다(happyCnt, sadCnt).

 

반복을 종료 후 행복 카운트와 우울 카운트가 0 임에 따른 예외 처리를 해준다.

두 개의 카운트 모두 0이 아니면 행복 점수를 구해준다(percentage) 정확한 소수 판별을 위해 BigDecimal을 사용했다.

percentage를 소수점 2번째 자리까지 보이도록 반올림해 출력한다.

 

 

문제 해결 과정

일반 Double에서 소수점이 ??.5일 때 반올림이 되지 않는 문제가 있었다. 커스텀 함수를 쓴 것도 아니고 원래 있는 함수에서.

찾아보니까 원래 Double의 round()가 문제가 있다더라.

그래서 BigDecimal을 사용해 주었다.

 

 

앱 개발 입문 팀 프로젝트

선택 구현 사항 일부 구현

활동 내용 간단 정리

다크 테마가 적용되도록 변경함.

기기가 가로 모드일 때, 그에 대응할 수 있도록 UI 구현.

 


 

오늘 공부 내용 정리 및 회고

오늘까지 해서 앱 개발은 얼추 마무리 지었다.

내일부터는 디테일하게 문제가 있으면 해결하고, ppt를 작성해 볼 것이다.

알고리즘 문제는 solved ac의 마라톤 문제를 계속 해결하고 있다. bronze 난이도의 문제라 큰 어려움은 없다.

728x90