첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 50)가 주어진다. 각 테스트 케이스는 첫째 줄에 수열의 크기 M이 주어진다. (1 ≤ M ≤ 10,000) 그 다음 줄부터는 그 수열에 들어있는 수가 주어지고, 한 줄에 10개씩 나누어서 주어진다. 따라서 마지막 줄은 수가 10개가 아닐 수도 있다. 수는 10,000보다 작거나 같은 자연수이다.
또한, 구간은 최소 1개 원소를 보유해야 하므로, 최종적으로 모든 합이 같으려면 그 경우의 수는 전체 구간 중 최댓값보다는 크거나 같아야 한다.
풀이 코드(Python)
import sys
input = sys.stdin.readline
def is_enable_sum(array, target):
tmp = 0
for a in array:
tmp += a
if tmp > target:
return False
if tmp == target:
tmp = 0
return tmp == 0
def search(array):
min_val, sum_val = max(array), sum(array)
check_list = []
for i in range(1, int(sum_val**0.5) + 1):
if sum_val % i != 0 :
continue
if i >= min_val:
check_list.append(i)
if i**2 != sum_val:
check_list.append(sum_val // i)
check_list.sort()
for c in check_list :
if is_enable_sum(array, c) :
return c
return 0
def init():
N = int(input())
array = []
cnt = N // 10
if N % 10:
cnt += 1
for _ in range(cnt):
array += list(map(int, input().split()))
return array
def solve():
Q = int(input())
for _ in range(Q):
array = init()
print(search(array))
if __name__ == "__main__":
solve()
풀이 코드(Go)
package main
import (
"bufio"
"fmt"
"math"
"os"
"sort"
)
const max int = 10001
var reader *bufio.Reader = bufio.NewReader(os.Stdin)
var writer *bufio.Writer = bufio.NewWriter(os.Stdout)
func isEnableSum(array []int, target int) bool {
tmp := 0
for _, a := range array {
tmp += a
if tmp > target {
return false
}
if tmp == target {
tmp = 0
}
}
return tmp == 0
}
func search(array []int) int {
minVal := max
sumVal := 0
for _, a := range array {
if minVal > a {
minVal = a
}
sumVal += a
}
checkList := []int{}
for i := 1; i <= int(math.Sqrt(float64(sumVal))); i++ {
if sumVal%i > 0 {
continue
}
if i >= minVal {
checkList = append(checkList, i)
}
if i*i != sumVal {
checkList = append(checkList, sumVal/i)
}
}
sort.Ints(checkList)
for _, c := range checkList {
if isEnableSum(array, c) {
return c
}
}
return 0
}
func initalize() []int {
var n, lines int
fmt.Fscanln(reader, &n)
array := make([]int, n)
for i := 0; i < n; i = i + 10 {
lines = 10
if n-i < 10 {
lines = n - i
}
for j := 0; j < lines; j++ {
fmt.Fscan(reader, &array[i+j])
}
}
fmt.Fscanln(reader)
return array
}
func main() {
defer writer.Flush()
var q int
fmt.Fscanln(reader, &q)
for i := 0; i < q; i++ {
array := initalize()
fmt.Fprintln(writer, search(array))
}
}