dev/algorithm

BOJ / 1024번 / 수열의 합 [Go][Python3]

crscnt 2021. 1. 9. 21:00

👩🏻‍💻 문제

 

1024번: 수열의 합

첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이고, L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다.

www.acmicpc.net


✍🏻 풀이

🎨 Go

// https://www.acmicpc.net/problem/1024
package main

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

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

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

	start := n/l - l/2
	var sum int
	for {
		if start < 0 {
			start++
		}
		sum = 0
		for i := start; i < start+l; i++ {
			sum += i
		}
		if sum < n {
			start++
		} else if sum == n {
			if start < 0 {
				fmt.Fprintln(writer, -1)
				return
			}
			break
		} else if sum > n {
			l++
			if l > 100 {
				fmt.Fprintln(writer, -1)
				return
			}
			start = n/l - l/2
		}
	}
	for i := start; i < start+l; i++ {
		fmt.Fprintf(writer, "%d ", i)
	}
	fmt.Fprintln(writer, "")
}

🎨 Python3

# https://www.acmicpc.net/problem/1024
import sys

if __name__ == "__main__":
    n, l = list(map(int, sys.stdin.readline().split()))

    start = n//l - l//2
    total = 0
    is_valid = True
    while True:
        if start < 0:
            start += 1
        total = 0
        for i in range(start, start+l):
            total += i
        if total < n:
            start += 1
        elif total == n:
            if start < 0:
                is_valid = False
                break
            break
        elif total > n:
            l += 1
            if l > 100:
                is_valid = False
                break
            start = n//l - l//2
    if is_valid:
        for i in range(start, start+l):
            print("{} ".format(i), end='')
        print()
    else:
        print(-1)
728x90