
Kotlin Boxing Type 쓰지 마세요 체질이라는게바뀝니다
DoDoBest
·2024. 3. 26. 23:06
240409 내용 추가
이 글에서 설명한 시간 측정 차이는 프로그래머스 채점 오류라고 생각합니다. 아래 글을 참고해주세요.
https://dodobest.tistory.com/96
프로그래머스 시간 측정 오류와 H-Index 문제
프로그래머스 Kotlin 시간 측정 오류 https://dodobest.tistory.com/86 Kotlin Boxing Type 쓰지 마세요 체질이라는게바뀝니다 프로그래머스 문자열 내림차순으로 배치하기 문제를 풀어보며, String을 다룰 때 어
dodobest.tistory.com
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
프로그래머스 문자열 내림차순으로 배치하기 문제를 풀어보며, String을 다룰 때 어떻게 하면 시간을 단축할 수 있는지 알아보겠습니다.
https://school.programmers.co.kr/learn/courses/30/lessons/12917
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr

String을 빠르게 다루는 방법
String을 정렬해야 한다면 아래의 순서를 따른다.
- charArray로 변환한다.
- Arrays.sort 함수를 이용해 정렬한다.
arr.sort의 내부 코드를 확인해보면 동일하게 Arrays.sort 함수를 이용하고 있으나, 시간 차이가 많이난다.
디컴파일된 코드를 확인해보면 arr.sort는 Kotlin의 collection boxing type을 사용하고 있는데, 이 과정에서 오버헤드가 발생하는 것으로 추정된다.

CharArray를 문자열로 바꿔야 한다면 String 함수를 이용한다.
joinToString은 내부적으로 StringBuilder를 이용해 문자열을 생성한다.
concatToString 함수는 내부적으로 String 함수를 호출하나, 디컴파일 된 코드를 보면 박싱타입을 사용하고 있다.

import java.util.Arrays class Solution { fun solution(s: String): String { val arr = s.toCharArray() Arrays.sort(arr) // 평균 0.5ms // arr.sort() // 평균 10ms val sb = StringBuilder(String(arr, 0, arr.size)) // 평균 0.5ms // val sb = StringBuilder(arr.joinToString("")) // 평균 15~18ms // val sb = StringBuilder(arr.concatToString()) // 평균 6~10ms return sb.reverse().toString() } }
처음에 시도한 방법
Ascii 코드 값, IntArray, StringBuilder를 이용하면 빠를 것으로 생각했으나, 15ms에 근접하는 시간이 소요됐다.

class Solution { fun solution(s: String): String { val sb = StringBuilder() val chars = IntArray(52) for (c in s) { val num = if (c >= 'a') { c - 'a' + 26 } else { c - 'A' } chars[num]++ } for (i in chars.lastIndex downTo 0) { val count = chars[i] if (count == 0) { continue } val char = charsCheatSheet[i] for (dummy in 0 until count) { sb.append(char) } } return sb.toString() } companion object { private val charsCheatSheet = charArrayOf('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',) } }
참고자료
https://ilmiodiario.tistory.com/53
[프로그래머스] level1. 문자열 내림차순으로 배치하기 (자바 JAVA)
[ 문제 ] [프로그래머스] level1. 문자열 내림차순으로 배치하기 (자바 JAVA) 문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/12917 코딩테스트 연습 - 문자열 내림차순으로 배치하기 문자열 s에 나
ilmiodiario.tistory.com
'코딩테스트' 카테고리의 다른 글
Leetcode 42. Trapping Rain Water (0) | 2024.04.12 |
---|---|
프로그래머스 시간 측정 오류와 H-Index 문제 (0) | 2024.04.09 |
프로그래머스 햄버거 만들기 Kotlin 빠른 답안 (0) | 2024.03.22 |
프로그래머스 체육복 Kotlin 빠른 답안 (0) | 2024.03.18 |
프로그래머스 삼총사 다르게 풀어보기 with Kotlin (0) | 2024.03.03 |