dev/algorithm
BOJ / 10816λ² / μ«μ μΉ΄λ 2 [Go][Python3]
crscnt
2020. 11. 19. 21:00
π©π»π» λ¬Έμ
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