[ 접근 방법 ]
- 처음에는 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() 를 사용하는 게 좋아 보여서 다음부터 참고하여 사용해 봐야겠다.
'Kotlin 문법 및 연습 문제' 카테고리의 다른 글
Kotlin - 문자열 내 마음대로 정렬하기 (1) | 2024.03.21 |
---|---|
(Kotlin) - 이상한 문자 만들기 (0) | 2024.03.15 |
Kotlin - object를 이용한 싱글톤 객체 생성 (0) | 2024.03.13 |
Kotlin - 비동기 프로그래밍 (쓰레드, 코루틴) (2) | 2024.03.12 |
(Kotlin) 나누어 떨어지는 숫자 (0) | 2024.03.07 |