Kotlin 문법 및 연습 문제

(Kotlin) - 프로그래머스 푸드 파이터 대회

돗개진 2024. 3. 28. 20:33

프로그래머스 코딩테스트 연습 문제- 푸드 파이트 대회

 

 

 

 

 

 

 

 

 

 

[ 접근 방법 ]

- 처음에는 result 에 122333 이 추가될 때 동시에 끝자리부터 333221 를 추가하려고 했지만 생각해 보니 그렇게까지 할 필요가 없었다. '1223330' 까지 만들어 주고 나면 그 뒤에는 '333221' 즉 0을 제외한 역순으로 문자열을 이어주면 됐기 때문이다.

class Solution {
    fun solution(food: IntArray): String {
        var answer = mutableListOf<Char>()

        for(i in 1 until food.size) {
            if(food[i] % 2 == 0) {
                for(j in 1..food[i]/2) {
                    answer.add(i.toString()[0])
                }
            }
            if(food[i] % 2 == 1) {
                food[i] = food[i] - 1
                for(j in 1..food[i]/2) {
                    answer.add(i.toString()[0])
                }
            }
        }
        answer.add('0')

        var rev: String = answer.joinToString("").reversed().substring(1)

        return answer.joinToString("") + rev
    }
}

ㄴ> 따라서 for문을 사용하여 food의 요소가 선수 둘이서 나눠 먹을 수 있는지 (짝수) 없는지 (음식이 1개) 또는 나눠 먹을 수 있지만 남는 경우 (홀수) 를 생각해서 코드를 짰다.

 

for문이 끝나면 물인 '0' 을 추가하도록 했고 반복문이 종료되면 answer 에는 '0'으로 끝나는 문자열이 완성된다. 그럼 answer 에 담긴 (입출력 예#1 가정) '122330' 을 0을 빼고 나머지인 '333221' 를 붙이기 위해서 먼저 answer를 문자열로 바꾸고 reversed 하여 '0333221' 로 만든다.

 

이후에는 0을 뺀 나머지만 붙이면 되므로 substring을 사용하여 substring(1) = 1번째 인덱스부터 문자열을 가져오는 것이기 때문에 0번째 인덱스에 있는 '0'은 제외된다.

 

rev 에는 '0333221' 이 아닌 '333221' 이 남게 되고 이를 answer와 연결해 주면 원하는 결과를 만들 수 있다.

 

=> 입출력 예시로 주어진 테스트 코드는 통과하였으나 채점을 하니 런타임 에러가 잔뜩 떠서 100점 만점에 45점으로 오답을 받았다. Android Studio 에서 코드를 다시 돌리고 숫자가 큰 값을 food의 원소로 넣은 결과 타입이 맞지 않아서 에러가 생기는 것 같았다. (에러 종류: numberformatexception for input string) 에러에 대해 검색한 후 해결법(문자열을 강제로 정수형 타입으로 변환하려고 했던 것이 문제)을 찾았고 금방 해결할 수 있었다.

 

 

 [ 다른 사람의 풀이 ]

class Solution {
    fun solution(food: IntArray): String {
        val sb = StringBuilder()
        for (i in 1..food.lastIndex) {
            repeat(food[i] / 2) { sb.append(i) }
        }
        val reversed = sb.reversed()
        sb.append(0)
        sb.append(reversed)
        return sb.toString()
    }
}

ㄴ>  repeat 이란 함수를 사용했고 홀수 판별 없이 코드를 보기에 훨씬 간단하게 짰다. 문자열을 자주 만지고 다뤄야 할 땐에는 StringBuilder() 를 사용하는 게 좋아 보여서 다음부터 참고하여 사용해 봐야겠다.