ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ๋ฌธ์ œ

 

1654๋ฒˆ: ๋žœ์„  ์ž๋ฅด๊ธฐ

์ฒซ์งธ ์ค„์—๋Š” ์˜ค์˜์‹์ด ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋žœ์„ ์˜ ๊ฐœ์ˆ˜ K, ๊ทธ๋ฆฌ๊ณ  ํ•„์š”ํ•œ ๋žœ์„ ์˜ ๊ฐœ์ˆ˜ N์ด ์ž…๋ ฅ๋œ๋‹ค. K๋Š” 1์ด์ƒ 10,000์ดํ•˜์˜ ์ •์ˆ˜์ด๊ณ , N์€ 1์ด์ƒ 1,000,000์ดํ•˜์˜ ์ •์ˆ˜์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ญ์ƒ K โ‰ฆ N ์ด๋‹ค. ๊ทธ

www.acmicpc.net


โœ๐Ÿป ํ’€์ด

๐ŸŽจ Go

// https://www.acmicpc.net/problem/1654
// ํ”ํžˆ parametric search๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋Š”, ์ด๋ถ„ ํƒ์ƒ‰์„ ์‘์šฉํ•˜์—ฌ ์ตœ์†Ÿ๊ฐ’์ด๋‚˜ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๋Š” ํ…Œํฌ๋‹‰์„ ๋ฐฐ์šฐ๋Š” ๋ฌธ์ œ
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var k, n int
	fmt.Fscanln(reader, &k, &n)

	var lengths = make([]int, k)
	for i := 0; i < k; i++ {
		fmt.Fscanln(reader, &lengths[i])
	}

	sort.Ints(lengths) // ์ฃผ์–ด์ง„ ๋žœ์„  ๊ธธ์ด์ค‘ ๊ฐ€์žฅ ๊ธด ๋žœ์„ ์˜ ๊ธธ์ด๋ฅผ ํƒ์ƒ‰ ๋ฒ”์œ„๋กœ ์žก๊ธฐ ์œ„ํ•ด ์ •๋ ฌํ•œ๋‹ค.
	fmt.Fprintln(writer, getMaxLength(n, lengths))
}

func getMaxLength(n int, lengths []int) (maxLength int) {
	start := 1
	end := lengths[len(lengths)-1] // ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ start, end๋กœ ์ง€์ •
	var mid int
	for start <= end {
		mid = (start + end) / 2 // ์ด๋ถ„ ํƒ์ƒ‰๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฒ”์œ„๋ฅผ ์ขํ˜€ ๋‚˜๊ฐ„๋‹ค.
		var totalCount int
		for i := 0; i < len(lengths); i++ {
			totalCount += lengths[i] / mid
		}
		if totalCount >= n {
			if maxLength < mid {
				maxLength = mid
				start = mid + 1
			}
		} else if totalCount < n {
			end = mid - 1
		}
	}
	return
}

๐ŸŽจ Python3

# https://www.acmicpc.net/problem/1654
# ํ”ํžˆ parametric search๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋Š”, ์ด๋ถ„ ํƒ์ƒ‰์„ ์‘์šฉํ•˜์—ฌ ์ตœ์†Ÿ๊ฐ’์ด๋‚˜ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๋Š” ํ…Œํฌ๋‹‰์„ ๋ฐฐ์šฐ๋Š” ๋ฌธ์ œ
import sys

def get_max_length(n, lengths):
    start = 1
    end = lengths[-1]
    mid = 0
    max_length = 0
    while start <= end:
        mid = (start + end) // 2
        total_count = 0
        for i in range(len(lengths)):
            total_count += lengths[i] // mid
        if total_count >= n:
            if max_length < mid:
                max_length = mid
                start = mid + 1
        elif total_count < n:
            end = mid - 1
    return max_length

if __name__ == "__main__":
    k, n = map(int, sys.stdin.readline().split())
    lengths = []
    for i in range(k):
        lengths.append(int(sys.stdin.readline()))
    lengths.sort()
    print(get_max_length(n, lengths))
728x90
๋Œ“๊ธ€