달달한 스토리

728x90
반응형

출처 핀터레스트

 

어제 풀다 만 숫자 짝꿍 문제를 풀어보자.

 

숫자 짝꿍

 

//숫자 짝꿍
class NumberMate {
    fun solution(X: String, Y: String): String {
        val answer = StringBuilder()

        val arrX = IntArray(10)
        val arrY = IntArray(10)

        countNumInArr(X, arrX)
        countNumInArr(Y, arrY)

        for (i in arrX.indices.reversed()) {
            while (arrX[i] >= 1 && arrY[i] >= 1) {
                arrX[i]--
                arrY[i]--
                answer.append(i)
            }
        }

        val result = if (answer.toString() == "") {
            "-1"
        } else if (answer.toString().startsWith("0")) {
            "0"
        } else {
            answer.toString()
        }
        return result
    }

    private fun countNumInArr(str: String, arr: IntArray) {
        for (element in str) {
            val index = element - '0'
            arr[index]++
        }
    }
}

두 숫자 조합에서 같은 숫자끼리만으로 제일 높은 숫자 조합을 만드는 문제이다.

 

countNumInArr를 만들어서 문자열에 있는 숫자를 가져와

 

해당 인덱스에 카운트를 해준다.

 

arrX를 값이 있는 인덱스 순서로 for문을 돌려주어,

 

해당 인덱스에 arrX와 arrY가 1보다 높은 값을 가지고 있다면,

 

각 배열을 1씩 차감해주고,

 

해당 i 값을 answer StringBulder에 append 해준다.

 

그 후 값이 비어 있거나, 0으로 되어 있을 때, 혹은 아닐 때를 조건문으로 나누어주어

 

반환한다.

 

 

성격 유형 검사하기

 

//성격 유형 검사하기
class TestYourPersonalityType {
    //유형 점수 매기기 맵
    val categories = mutableMapOf(
        'R' to 0,
        'T' to 0,
        'C' to 0,
        'F' to 0,
        'J' to 0,
        'M' to 0,
        'A' to 0,
        'N' to 0
    )

    fun solution(survey: Array<String>, choices: IntArray): String {
        //선택지에 따른 점수
        val scores = mapOf(
            1 to 3,
            2 to 2,
            3 to 1,
            4 to 0,
            5 to 1,
            6 to 2,
            7 to 3
        )

        survey.forEachIndexed { i, s ->
            val choice = choices[i]
            var categoryStr: Char

            if(choice < 4) {
                //선택지가 비동의 일때

                //문자열에 첫번째 문자
                categoryStr = s[0]

            } else if(choice > 4) {
                //선택지가 동의 일때

                //문자열에 두번째 문자
                categoryStr = s[1]
            } else {
                //선택지가 4번일때
                //어떤 유형도 점수를 얻지 못한다.
                return@forEachIndexed
            }

            //해당 카테고리에 선택지에 따른 점수 넣어주기
            categories[categoryStr] = categories[categoryStr]!! + scores[choice]!!
        }

        val result = StringBuilder()
            .append(compareCategory('R', 'T'))
            .append(compareCategory('C', 'F'))
            .append(compareCategory('J', 'M'))
            .append(compareCategory('A', 'N')).toString()

        return result

    }

    //두개의 카테고리 중 점수가 더 높은 카테고리를 반환하는 메서드
    //만약 점수가 같다면, 사전순으로 반환
    private fun compareCategory(firstCate: Char, secondCate: Char): Char {
        val firstScore = categories[firstCate] ?: 0
        val secondScore = categories[secondCate] ?: 0

        return if(firstScore > secondScore) {
            firstCate
        } else if(firstScore < secondScore) {
            secondCate
        } else {
            (firstCate + secondCate.toString()).toSortedSet().first()
        }
    }
}

유형 별 맵(categories)과 선택지에 따른 점수 맵(scores)를 미리 만들어 둔다.

 

그리고 survey를 foreach하며 문제를 푼다.

 

선택지가 4이하의 숫자라면,

 

비동의이고, 문자열중 오른쪽 문자가 된다.

 

4 이상이면,

 

동의이고, 문자 열중 왼쪽 문자가 된다.

 

그 외에는 4인데, 아무것도 선택하지 않은 0점이라,

 

foreach에서 건너뛰는 return을 해준다.

 

그리고 결괏값으로 categories 맵의 중첩하여 점수를 더해준다.

 

그리고,

 

categorey를 비교해주는 compareCategory 메서드로

 

두 문자 중 더 높은 점수를 가져고 있는 문자를 반환해주고,

 

만약 점수가 같다면, 사전 순으로 앞서고 있는 문자를 반환하게 만든다.

728x90
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading