언어 모델은 확률 분포에서 다음 토큰을 고릅니다. 두 가지 설정이 분포의 모양을 정합니다.
- 'Top-k: 로짓이 가장 높은 k개의 토큰만 남깁니다 (로짓이 같으면 인덱스가 작은 쪽이 더 높은 순위).'
- '온도 T: 소프트맥스 전에 남긴 로짓을 T로 나눕니다. T가 낮으면 선택이 예측 가능해지고, T가 높으면 더 무작위가 됩니다.'
테스트할 수 있도록 난수가 주어집니다.
- 상위 k개 토큰을 남기고, 원래 인덱스의 오름차순으로 나열합니다.
- 남긴 토큰에 대해 softmax(logit / T)를 계산합니다 (e^x를 계산하기 전에 가장 큰 값을 뺍니다).
- 목록을 따라가며 확률을 더하고, 누적 합이
random_value보다 처음으로 커지는 토큰의 인덱스를 반환합니다. 아무것도 넘지 않으면(반올림 오차) 마지막으로 남긴 토큰을 반환합니다.
k = 1이면 탐욕적 디코딩, 즉 항상 가장 가능성 높은 토큰을 고릅니다.
sample_token(logits, temperature, k, random_value)를 구현하세요.
입력
logits: 어휘의 토큰마다 하나의 점수.
temperature: T, 0보다 큼.
k: 남길 상위 토큰 수.
random_value: [0, 1) 범위의 난수.
출력
선택된 토큰의 인덱스를 반환하세요.
제약 조건
1 ≤ k ≤ 로짓 수 ≤ 1,000
0 < temperature ≤ 100, 0 ≤ random_value < 1
-100 ≤ 각 로짓 ≤ 100
예시
입력:
logits = [1.0, 3.0, 2.0, 0.5]
temperature = 1.0
k = 1
random_value = 0.99
예상 출력:
1
설명
k = 1이면 가장 높은 로짓, 인덱스 1의 3.0만 남습니다. 확률이 1이므로 난수와 상관없이 선택됩니다: 탐욕적 디코딩입니다.
입력:
logits = [2.0, 1.0, 0.0]
temperature = 1.0
k = 2
random_value = 0.8
예상 출력:
1
설명
Top-2는 인덱스 0과 1(로짓 2와 1)을 남깁니다. 소프트맥스는 약 0.731과 0.269입니다. 누적 합은 인덱스 0 다음에 0.731(0.8을 넘지 않음), 인덱스 1 다음에 1이므로 인덱스 1이 선택됩니다.
참고 자료
-
예시 1 미실행입력:
logits = [1.0, 3.0, 2.0, 0.5] temperature = 1.0 k = 1 random_value = 0.99예상 출력:1내 출력 -
예시 2 미실행입력:
logits = [2.0, 1.0, 0.0] temperature = 1.0 k = 2 random_value = 0.8예상 출력:1내 출력
제출 시 4개의 숨겨진 테스트도 실행됩니다. 코드가 하나라도 실패하면 그 테스트를 볼 수 있습니다. 챌린지를 해결하면 모두 볼 수 있습니다.
Online Kotlin Compiler
Write, compile, run, and debug Kotlin code online in a full-featured browser IDE. Work with multiple files, save your workspace, and collaborate in real time.
🧩 이 Kotlin 온라인 실행기 소개
CodeUtility Kotlin Executor를 사용하면 브라우저에서 바로 Kotlin 코드를 작성, 컴파일, 실행할 수 있습니다 - 설치, IDE, SDK 설정이 필요 없습니다. 격리된 샌드박스에서 실제 Kotlin 컴파일러가 동작해 안전하고 실제와 같은 실행 환경을 제공합니다.
이 도구는 여러 Kotlin 버전 - 1.6, 1.9, 2.1 - 을 지원하므로 문법 업데이트를 살펴보고, 코드 호환성을 테스트하며, 코루틴, 데이터 클래스, 봉인 인터페이스 같은 최신 언어 기능을 자유롭게 실험할 수 있습니다.
Kotlin 기초를 배우는 학생, 스니펫을 실험하는 Android 개발자, 혹은 브라우저를 벗어나지 않고 JVM 환경에서 로직을 테스트하려는 백엔드 엔지니어에게 안성맞춤입니다.
각 스니펫은 보안 컨테이너 런타임에서 실행되어 일관된 성능과 안전한 코드 실행을 보장합니다.
하나의 실행기에서 다중 파일 편집기, 격리된 실행 터미널, 런타임별 라이브러리, 영구 작업 공간, 공유 및 실시간 협업을 이용하세요.
이 실행기는 어떻게 사용하나요?
런타임을 선택하고 파일을 열거나 만든 다음 코드를 작성하고 실행을 선택하세요. 출력은 터미널에 표시되며, 로그인한 사용자는 작업 공간에 파일을 보관하고 라이브러리를 설치하며 공유를 통해 협업할 수 있습니다.
- 버전을 선택하고 현재 파일을 편집하거나 작업 공간의 다른 파일을 여세요.
- 코드를 실행하고 요청 시 터미널에 입력한 다음 저장된 실행 기록을 확인하세요.
- 작업에 둘 이상의 코드 조각이 필요하면 라이브러리, 작업 공간 도구, 공유 및 채팅을 사용하세요.
💡 초보자를 위한 Kotlin 기본 가이드
1. 변수와 상수 선언
Kotlin은 val은 변경 불가능, var는 변경 가능한 변수에 사용합니다.
val name: String = "Alice"
var age: Int = 30
val pi = 3.14 // 타입이 추론됨
// 상수
const val MAX_USERS = 100
2. 조건문 (if / when)
if 표현식이나 여러 분기는 when을 사용하세요.
val x = 2
if (x == 1) {
println("하나")
} else if (x == 2) {
println("둘")
} else {
println("그 외")
}
when (x) {
1 -> println("하나")
2 -> println("둘")
else -> println("그 외")
}
3. 반복문
반복에는 for, while, do-while을 사용합니다.
for (i in 0..2) {
println(i)
}
var n = 3
while (n > 0) {
println(n)
n--
}
4. 배열
Kotlin은 arrayOf() 함수를 사용해 배열을 지원합니다.
val numbers = arrayOf(10, 20, 30)
println(numbers[1])
5. 리스트 다루기
동적 리스트에는 mutableListOf를 사용하세요.
val nums = mutableListOf(1, 2, 3)
nums.add(4)
nums.removeAt(0)
for (n in nums) {
print("$n ")
}
6. 콘솔 입력/출력
입력에는 readLine(), 출력에는 println()을 사용합니다.
print("이름을 입력하세요: ")
val name = readLine()
println("안녕하세요, $name")
7. 함수
함수는 fun 키워드와 선택적 반환 타입을 사용합니다.
fun add(a: Int, b: Int): Int {
return a + b
}
println(add(3, 4))
8. 맵
mutableMapOf는 키-값 쌍을 저장합니다.
val ages = mutableMapOf("Alice" to 30)
println(ages["Alice"])
9. 예외 처리
try, catch, finally로 오류를 처리하세요.
try {
val result = 10 / 0
} catch (e: ArithmeticException) {
println("오류: ${e.message}")
}
10. 파일 입출력
파일 작업에는 java.io의 File을 사용합니다.
import java.io.File
File("file.txt").writeText("안녕, 파일")
val text = File("file.txt").readText()
println(text)
11. 문자열 다루기
Kotlin 문자열은 다양한 메서드와 문자열 보간을 지원합니다.
val text = "안녕하세요 세상"
println(text.length)
println(text.substring(0, 5))
println(text.contains("세상"))
12. 클래스와 객체
Kotlin 클래스는 간결하며 기본 생성자를 지원합니다.
class Person(val name: String) {
fun greet() = println("안녕하세요, 저는 $name입니다")
}
val p = Person("Alice")
p.greet()
13. 널 안전성
Kotlin은 널 허용 타입과 널 비허용 타입을 구분합니다. 안전을 위해 ?와 ?:를 사용하세요.
val name: String? = null
println(name?.length ?: 0)