연속 부분 수열 합의 개수
원형수열에서 나올 수 있는 중복을 제외한 합의 개수를 모두 구해야한다.
시간이 오버되어 다른 풀이를 참고했다.
원형으로 만들기위해 새배열에 주어진 배열을 두번 넣어줬다.
각 부분수열의 합을 구해 중복방지를 위해 set컬렉션에 모두 넣어주고 set의 길이를 리턴해주었다.
나의 풀이
class Solution {
fun solution(elements: IntArray): Int {
var answer: Int = 0
var set = mutableSetOf<Int>()
var mElements = elements + elements
for(i in 1..elements.size){
for(j in 0..elements.size){
set.add(mElements.copyOfRange(j, j+i).sum())
}
}
return set.size
}
}
i를 이용해 연속부분수열의 길이를 조절한다.
mElements.copyOfRange(j, j+i).sum()은 배열에서 j ~ j+i 범위의 요소들을 새배열로 만들어 모든 요소를 더한다.
다른사람의 풀이
class Solution {
fun solution(elements: IntArray): Int {
val doubling = elements+elements
val result = HashSet<Int>()
for (i in 1..elements.size) {
result.addAll((elements.indices).map {
doubling.slice(it until it + i).sum()
})
}
return result.size
}
}
작업처리단위는 쓰레드
쓰레드1이 쓰레드2에게 작업을 맡기고 다음작업을 수행 쓰레드1이 쓰레드3에게 작업을 맡기고 다음작업을 수행 하는 방식
효율을 높이려고 나온 방식이지만 지금에선 비효율적인 부분이 있음
fun main( {
thread(name = "쓰레드 #1"){
thread(name = "쓰레드 #2"){
val user = fetchUser()
println(user)
}
thread(name = "쓰레드 #3"){
val product = fetchProduct()
println(product)
}
}
})
하나의 쓰레드 안에 여러작업단위가 존재
fun main() = runBlocking{
launch{
wait1000ms()
println("world!")
}
println("Hello")
}
suspend fun wait1000ms(){
delay(1000L)
}
runBlocking
suspend fun
코루틴의 실행범위를 정의하고 코루틴의 생명주기를 관리한다.
코루틴은 Scop에 바인딩 되며 부모 Scope이 종료 or 취소되면 자동으로 내부의 모든 코루틴 역시 종료 or 취소됨 (ex. ViewModel이 종료되면 viewModelScope이 종료되고 내부에 사용한 모든 코루틴이 종료됨)
coroutine Scope에 바인딩 되는 실행 환경 정보
코루틴의 실행에 필요한 정보들 보유 ( Coroutine Name, Job, Dispatcher)