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

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

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

 

출처: unsplash.com

 

코드카타 문제풀이

패션왕 신해빈(Silver 3, 9375번)

문제 내용

 

문제 풀이 방법

가진 의상의 수가 n개 주어진다.의상 입력은 의상의 이름과 의상의 종류가 주어진다.

같은 종류의 의상은 하나만 입을 수 있고 한 종류 이상의 의상을 안 입을 수도 있다.

해빈이가 알몸이 아닌 상태로 입을 수 있는 의상의 경우의 수를 출력.

알몸이 아닌 상태라는 건, 한 개의 이상의 의상을 입었을 때는 뜻한다.

 

 

해결 코드(스포 주의)

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

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val case = readLine().toInt()
    for (i in 0 until case) {
        val clothesCnt = readLine().toInt()
        val clothes = mutableMapOf<String, MutableList<String>>()

        for (j in 0 until clothesCnt) {
            val (name, type) = readLine().split(" ")
            if (!clothes.containsKey(type)) clothes[type] = mutableListOf(name)
            else clothes[type]?.add(name)
        }

        var res = 1
        for (j in clothes.values) {
            // 옷을 안입는 경우를 고려해 + 1
            res *= (j.size + 1)
        }

        // 알몸인 상태를 제외해야 해서 - 1
        println(res - 1)
    }
}

 

풀이 과정

테스트 케이스의 수만큼 반복한다.옷의 개수를 입력받는다.

또한 옷의 이름(name)과 종류(type)를 입력받아 map(clothes)에 저장해 준다.

 

옷의 정보를 type을 key로 가지고, type에 맞는 옷들의 이름을 list형태로 저장한다.

해빈이가 각각의 옷의 종류를 입는 경우의 수가 옷의 개수와 안 입는 경우까지 포함해서 j.size + 1이다.

이를 res에 곱해준다(조합의 개념).

곱해준 결과에 각각의 옷의 종류에 안 입는 경우가 포함되어 있어 알몸인 경우가 있기 때문에 알몸인 경우인 1을 빼서 출력해 준다.

 

 

문제 해결 과정

map을 구현하는 것은 쉬웠지만, 조합의 경우의 수를 구하는 것에서 좀 애를 먹었다.

결국 풀이를 검색해서 문제를 해결했지만, 조합의 경우를 따지는 방법을 연습을 해봐야 할 것 같다.

 

 

팀 프로젝트

다른 사용자에게 알람 메시지 보내기 & 현재 사용자에게 보낸 메시지를 notification으로 출력하기.

공부 내용 간단 정리

현재 존재하던 n초 후에 notification 보내는 기능을 삭제하고, notification icon을 누르면 누른 item의 user에게 메지시를 보낼 수 있도록 dialog를 띄우고, 띄운 dialog에 입력값을 넣고 전송하기 버튼을 누르면 해당 메시지를 보낸 사람이 sender로 저장되고, 메시지를 받는 사람을 receiver로 설정해 값을 저장하도록 해주었다.

data class NotificationData(
    val receiver: String = "",
    val messageData: MutableList<NotificationMessageData> = mutableListOf()
)

data class NotificationMessageData(
    val sender: String = "",
    val message: String = ""
)

위 코드는 메시지 전송값과 메시지를 보낸 사람과 메시지를 받는 사람이 저장되도록 하는 data class들이다.

 

또한 메시지를 보냈을 때의 로직과 현재 사용자가 접속했을 때의 메시지가 쌓여 있으면 notification을 보낼 수 있도록 판단해 주는 함수를 만들어 주었다.

object MessageObject {
    private val messageList = mutableListOf<NotificationData>()

    fun getInstance() = messageList

    // sender: 메시지를 보낸 사람.
    // receiver: 메시지를 받을 사람.
    // message: 보낸 메시지
    fun addMessage(sender: String, receiver: String, message: String) {
        if (messageList.none { it.receiver == receiver }) {
            messageList.add(
                NotificationData(
                    receiver = receiver,
                    messageData = mutableListOf(NotificationMessageData(sender, message))
                )
            )
        } else {
            val receiverData = messageList.first { it.receiver == receiver }
            receiverData.messageData.add(
                NotificationMessageData(sender, message)
            )
        }
    }

    // 새로 로그인한 사람이
    fun checkMyMessage(userName: String): MutableList<NotificationMessageData> {
        val contains = messageList.filter { it.receiver == userName }
        return if (contains.isNotEmpty()) contains.first().messageData
        else mutableListOf()
    }
}

 

 


 

오늘 공부 내용 정리 및 회고

오늘까지 팀 프로젝트에 필요한 기능 구현을 마무리하고 발표 준비에 들어가야 한다.

시간이 상당히 촉박하다.

728x90