๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Programming/Algorithm

[Kotlin] ๋ฐฐ์ค€ 3460 - ์ด์ง„์ˆ˜

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
๋ฐ˜์‘ํ˜•