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

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๋ฌธ์ œ

 

10816๋ฒˆ: ์ˆซ์ž ์นด๋“œ 2

์ฒซ์งธ ์ค„์— ์ƒ๊ทผ์ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ˆซ์ž ์นด๋“œ์˜ ๊ฐœ์ˆ˜ N(1 โ‰ค N โ‰ค 500,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์ˆซ์ž ์นด๋“œ์— ์ ํ˜€์žˆ๋Š” ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ˆซ์ž ์นด๋“œ์— ์ ํ˜€์žˆ๋Š” ์ˆ˜๋Š” -10,000,000๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10,

www.acmicpc.net


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

๐ŸŽจ Go

// https://www.acmicpc.net/problem/10816
// ์ด๋ถ„ ํƒ์ƒ‰์œผ๋กœ ๊ฐ’์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฐพ์•„ ๋ด…์‹œ๋‹ค.
package main

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

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

	var n, m int
	fmt.Fscanln(reader, &n)
	var cards = make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Fscanf(reader, "%d ", &cards[i])
	}

	sort.Ints(cards) // ์ •๋ ฌ

	fmt.Fscanln(reader, &m)
	var targets = make([]int, m)
	for i := 0; i < m; i++ {
		fmt.Fscanf(reader, "%d ", &targets[i])
		fmt.Fprintf(writer, "%d ", upperBound(cards, targets[i])-lowerBound(cards, targets[i])+1)
	}
	fmt.Fprintln(writer, "")
}

// lowerBound: return the first occurrence of more than the desired value
func lowerBound(array []int, target int) int {
	var startIdx, endIdx, midIdx int
	endIdx = len(array) - 1

	for startIdx < endIdx {
		midIdx = (startIdx + endIdx) / 2
		if array[midIdx] >= target {
			endIdx = midIdx
		} else {
			startIdx = midIdx + 1
		}
	}
	return endIdx
}

// upperBound: return the position where the value larger than the value
// you are looking for appears first.
func upperBound(array []int, target int) int {
	var startIdx, endIdx, midIdx int
	endIdx = len(array) - 1

	for startIdx < endIdx {
		midIdx = (startIdx + endIdx) / 2
		if array[midIdx] > target {
			endIdx = midIdx
		} else {
			startIdx = midIdx + 1
		}
	}

	if array[endIdx] != target {
		endIdx--
	}
	return endIdx
}

/*
// ํ•ด์‹œ ๋งต์„ ์ด์šฉํ•œ ํ’€์ด
package main

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

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

	var n, m int
	fmt.Fscanln(reader, &n)
	var cards = make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Fscanf(reader, "%d ", &cards[i])
	}

	cardMap := map[int]int{} // ๋งต ์ด์šฉํ•˜์—ฌ ํ’€๊ธฐ
	for i := 0; i < len(cards); i++ {
		key := cards[i]
		cardMap[key]++
	}

	fmt.Fscanln(reader, &m)
	var targets = make([]int, m)
	for i := 0; i < m; i++ {
		fmt.Fscanf(reader, "%d ", &targets[i])
		fmt.Fprintf(writer, "%d ", cardMap[targets[i]])
	}
	fmt.Fprintln(writer, "")
}
*/

๐ŸŽจ Python3

# https://www.acmicpc.net/problem/10816
# ์ด๋ถ„ ํƒ์ƒ‰์œผ๋กœ ๊ฐ’์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฐพ์•„ ๋ด…์‹œ๋‹ค.
import sys
import bisect

if __name__ == "__main__":
    n = int(sys.stdin.readline())
    cards = list(map(int, sys.stdin.readline().split()))
    cards.sort()    # ์ •๋ ฌ
    m = int(sys.stdin.readline())
    targets = list(map(int, sys.stdin.readline().split()))
    for t in targets:
        lower_bound = bisect.bisect_left(cards, t) # bisect ๋ชจ๋“ˆ ์ด์šฉ lower bound ๊ตฌํ•˜๊ธฐ
        upper_bound = bisect.bisect_right(cards, t) # bisect ๋ชจ๋“ˆ ์ด์šฉ upper bound ๊ตฌํ•˜๊ธฐ
        print(upper_bound - lower_bound, end=" ")
    print()
728x90
๋Œ“๊ธ€