달달한 스토리

728x90
반응형

휴.. arcore로 정신없이 코딩하다.. 코테를 많이 하지 못해..

 

한 번에 세문제를 풀었다.

 

출처 핀터레스트

 

콜라 문제

 

//콜라 문제
class ColaProblem {
    fun solution(a: Int, b: Int, n: Int): Int {
        //가지고 있는 빈병 갯수
        var empty = n
        //받은 콜라 개수
        var recieved = 0
        while (empty > a - 1) {
            //몫
            val share = (empty / a) * b
            //나머지
            val remainder = empty % a
            //남은 콜라수
            empty = share + remainder
            //받은 콜라수
            recieved += share
        }
        return recieved
    }
}

 

빈병 개수가

 

마트에서 콜라를 받기 위해 주어야 하는 병 수 a에서 1을 뺀 수보다 

 

많을 때, 

 

식이 계속 실행된다.

 

빈병 개수를 a로 나누어 준 것을 

 

마트에 가져다주면 교환해주는 빈병 개수를 곱하면,

 

받게 되는 콜라 수 share가 나온다.

 

그리고,

 

개수가 맞지 않아 남은 병수가 있을 것이다. (remainder)

 

share와 더해서 empty의 값을 경신해주고,

 

얻게 된 콜라수 recieved도 갱신해준다.

 

나도 설명하니 복잡하다... 찬찬히 읽어보도록..

 

 

푸드 파이터 대회

 

//푸드 파이트 대회
class FoodFightContest {
    fun solution(food: IntArray): String {
        val sb = StringBuilder()
        for(i in 1 until food.size) {
            val foodNum = food[i]
            val cnt = foodNum / 2
            repeat(cnt) {
                sb.append(i)
            }
        }
        sb.append(0)
        sb.append(sb.replaceFirst(Regex("0"), "").reversed())
        return sb.toString()
    }
}

 

인트 배열에서 해당 인덱스의 값을

 

2로 나누게 되면, 음식을 반복해서 둘 수 있는

 

값(몫)이 나온다.

 

그 수만큼 반복해서 음식을 둔다.

 

for문이 완료되면,

 

가운데에 0을 둬야 하기 때문에

 

append 0을 넣어주고,

 

sb의 reversed가 다음에 들어올 문자열이기 때문에 값을 append 해준다.

 

하나 가운데 넣었던 0도 한 번 더 들어가기 때문에

 

repleceFirst로 제일 처음 발견한 0을 제거하여,

 

0을 하나만 남게 한다.

 

 

신규 아이디 추천

 

//신규 아이디 추천
class NewIDRecommendation {
    val sb = StringBuilder()

    fun solution(new_id: String): String {
        // 1. 대문자 소문자로 변환
        for (i in new_id) {
            sb.append(Character.toLowerCase(i))
        }
        // 2. 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거
        sb.replace(0, sb.length, toRegex("[^a-z0-9-_.]", ""))
        // 3. 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환
        sb.replace(0, sb.length, toRegex("\\.{2,}", "."))
        // 4.  마침표(.)가 처음이나 끝에 위치한다면 제거
        sb.replace(0, sb.length, toRegex("^[.]|[.]\$", ""))
        // 5. 빈 문자열이라면, new_id에 "a"를 대입합니다.
        sb.ifBlank { sb.replace(0, sb.length, "a") }
        // 6. 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
        //     만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
        if(sb.length >= 16) {
            sb.replace(15, sb.length, "").also {
                sb.replace(0, sb.length, toRegex("[.]\$", ""))
            }
        }
        // 7. 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
        if(sb.length <= 2) {
            while (sb.length < 3) {
                sb.append(sb[sb.length - 1])
            }
        }
        return sb.toString()
    }

    private fun toRegex(regex: String, replacement: String): String = sb.replace(Regex(regex), replacement)
}

 

이 문제는 정규식을 알아야 풀 수 있는 문제였다.

 

구글에서 정규식을 잘 참고하여 푼 문제이다..

 

딱히 설명보다는 코드에서 유추할 수 있으니..

 

설명은 생략하겠다.

728x90
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading