Programming/Algorithm

[Kotlin] λ°°μ€€ 3460 - μ΄μ§„μˆ˜

Space_Jin 2024. 10. 19. 17:14
728x90
λ°˜μ‘ν˜•

문제

μ–‘μ˜ μ •μˆ˜ n이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 이λ₯Ό μ΄μ§„μˆ˜λ‘œ λ‚˜νƒ€λƒˆμ„ λ•Œ 1의 μœ„μΉ˜λ₯Ό λͺ¨λ‘ μ°ΎλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. μ΅œν•˜μœ„ λΉ„νŠΈ(least significant bit, lsb)의 μœ„μΉ˜λŠ” 0이닀.

첫째 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 개수 Tκ°€ μ£Όμ–΄μ§„λ‹€. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” ν•œ μ€„λ‘œ 이루어져 있고, n이 μ£Όμ–΄μ§„λ‹€. (1 ≤ T ≤ 10, 1 ≤ n ≤ 10^6)

풀이

1. 2μ§„μˆ˜μ˜ 경우, 2둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€κ°€ μ‘΄μž¬ν•œλ‹€λ©΄(λ‚˜λ¨Έμ§€λŠ” 1) ν•΄λ‹Ή μœ„μΉ˜ 1의 값이 μ˜¨λ‹€.

2. ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ λ‹Ή n의 값을 2둜 계속 λ‚˜λˆˆλ‹€λ©΄ μ΅œλŒ€ log(n)번 μˆ˜ν–‰ν•΄μ•Όν•œλ‹€. O(TlogN)

3. TλŠ” μ΅œλŒ€ 10 n의 μ΅œλŒ“κ°’μ€ 10^6으둜 μ΄λ―€λ‘œ μ΅œλŒ€ log(10^7)의 μ‹œκ°„λ³΅μž‘λ„λ₯Ό κ°€μ§€λ―€λ‘œ 2둜 계속 λ‚˜λˆ„λŠ” 방법을 μ±„νƒν•œλ‹€.

μ†ŒμŠ€ μ½”λ“œ

import java.util.*

fun main() = with(Scanner(System.`in`)) {
    val T = nextInt()	// ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€ 수
    
    // 반볡
    for(i in 1..T){
        val N = nextInt()	// ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€
        module(N)	// λͺ¨λ“ˆ 호좜
    }
}

// μ΄μ§„μˆ˜λ₯Ό κ³„μ‚°ν•˜κ³  좜λ ₯ν•˜λŠ” λͺ¨λ“ˆ
fun module(N:Int) {
   val sb = StringBuilder()	// 좜λ ₯용 StringBuilder
   var n = N	// λ‚˜λˆŒκ°’(λͺ«)
   var c = 0	// ν˜„μž¬ 자리 인덱슀(1의 μžλ¦¬κ°€ 0)
   
   while(n > 0){
   	// 2의 λ‚˜λ¨Έμ§€κ°€ 1이라면, ν•΄λ‹Ή 자리λ₯Ό 1이 λ˜λ―€λ‘œ μœ„μΉ˜λ₯Ό μ €μž₯
	if(n % 2 == 1){
		sb.append(c)
		sb.append(" ")
	}
    
    // λ‹€μŒμ‘°κ±΄ μ„€μ •
	n /= 2	// 2둜 λ‚˜λˆˆ λͺ«
	c++		// λ‹€μŒ 자리(인덱슀)증가
   }
   println(sb)
}

 

728x90
λ°˜μ‘ν˜•