(코딩테스트)푸드 파이트 대회 (repeat())

2024. 4. 4. 17:54개발자 과정/Kotlin

https://school.programmers.co.kr/learn/courses/30/lessons/134240

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이의 선택과정

1. 문제 설명만 보면 어려워 보이지만, 하나씩 전부 연산할 필요는 없다. 

2. 0번째는 물의 개수고 1고정이니까 패스하고 그 뒤부터 전체 순회한다.

3. 해당 원소의 /2만큼만 인덱스answer에 넣어준다.

4. 끝나면 중간에 고정으로 있는 물을 뜻하는 0문자열을 뒤집어 붙여주면 된다.

 

문제고민

더 깔끔하게 하고 싶다

= 솔루션은 나왔는데 이중 for문을 좀 더 깨끗하게 다듬는 방법은 없을까?

 

해결방안

repeat()을 쓴다.

= repeat() 은 함수 내부적으로 전달한 값만큼 for문을 수행하는 함수로,

  람다로 식을 받아 처리한다.

  내부적으로 0..times가 아닌, 0 untile times로 구현되어 있다고 한다. 

  1부터 시작하는 경우보다 0부터 시작하는 경우가 더 많은데,

  이에따른 센스있는 설계라고 생각된다. 

 

정답풀이

class Solution {
    fun solution(food: IntArray): String {
        var answer: String = ""
        for(i in 1 until food.size)
        {
            repeat((food[i]/2)){answer+=i.toString()}
        }
        return answer+"0"+answer.reversed()
    }
}

 

핵심로직

 for(i in 1 until food.size)
        {
            repeat((food[i]/2)){answer+=i.toString()}
        }

= 0번째 원소는 제외하고, 문자열을 만들때 repeat(food[i]/2)를 함으로, 알아서 짝수로 보정이 되니,

  현재 인덱스를 더해주기만 하면 된다.  

 

새로 알게된 것

필요에 따라 repeat()의 선택도 좋다

물론 경우에 따라 다르겠지만, 코드를 좀 더 깔끔하게 다듬고 싶거나 할때,

 for문을 길게 늘여쓰지 않고, repeat()으로 간결하게 처리하는 것도 좋은 방법이라는 것을 알았다.