백준1024-수열의 합

Yeom Jae Seon·2021년 1월 18일
0

알고리즘

목록 보기
3/19
post-thumbnail

백준 1024 수열의합

N, L 입력두개가 주어지고
앞에있는 N은 수의합, L는 연속된 수의 최소 개수이다.
이를 통해 수열을 출력하라는 문제이다.

  1. L은 최소 개수이므로 조건에 맞을 때 까지 무한루프 돌림. 조건에 안맞으면 +1 한다. 그러다 L이 100보다크면 무한루프 탈출!(문제의 조건임.)
  2. N을 L로나누었을 때 중앙값을 중요하게 생각함, 중앙값 = crucialNum으로 지정
  3. 이 중앙값이 N에 나누어 떨어져, 즉 crucialNum * L == N인지 아닌지의 조건문을 먼저 시작함
  4. crucialNum * L == N일 때 L의 개수가 짝수인지 홀수인지 도 구분함. 만들어지는 배열(수열이 저장될 배열)이 달라지기 때문.
  5. 만들어진 배열의 원소의 합이 N이면 무한루프 결과 출력하고 무한루프 탈출, 그렇지 않으면 L += 1 해서 같은 행동 반복.

코드

# N <= 1,000,000,000
# 2 <= L <= 100
# N은 연속된 양수들의 합
# 연속된 양수들의 개수는 L보다 크거나 같되
# 가장 짧은 리스트를 '구하자'

N, L = map(int, input().split())
while True:
    crucialNum = N // L
    # print("결정값: ", crucialNum)
    arr = [crucialNum] * L
    # print("초기 arr: ", arr)
    # 나누어떨어진다는 뜻
    if crucialNum * L == N:
        if L % 2 == 0:
# L이 짝수
            # L // 2 - 1개 (좌변 배열)
            for i in range(0, L // 2 - 1):
                arr[i] -= L // 2 + i
            # 중앙
            arr[L // 2 - 1] = crucialNum
            # 우변배열
            for i in range(L // 2, L):
                arr[i] = arr[i - 1] + 1
        else:
# L이 홀수
            # 이경우는 무조건 ok임
            for i in range(0, L // 2):
                arr[i] -= (L // 2)
                arr[i] += i
            arr[L // 2] = crucialNum
            for i in range(L // 2, L):
                arr[i] = arr[i - 1] + 1
    # 나누어떨어지지않아.
    else:
        if L % 2 == 0:
# L이 짝수
            # 이경우는 무조건 ok임 - 무조건은아님 반례 - 201 4
            # L // 2 - 1개 (좌변 배열)
            for i in range(0, L // 2 - 1):
                arr[i] -= L // 2 - 1
                arr[i] += i
            # print("좌변: ", arr)
            # 중앙
            arr[L // 2 - 1] = crucialNum
            # print("중앙값: ", arr)
            # 우변배열
            for i in range(L // 2, L):
                arr[i] = arr[i - 1] + 1
            # print("우변: ", arr)
        else:
# L이 홀수
            for i in range(0, L // 2):
                arr[i] -= (L // 2)
                arr[i] += i
            arr[L // 2] = crucialNum
            for i in range(L // 2, L):
                arr[i] = arr[i - 1] + 1
    if arr[0] >= 0:
        if sum(arr) == N:
            for i in arr:
                print(i, end=' ')
            break;
    L += 1
    if L > 100:
        print(-1)
        break
  • 조건마다 배열을 만들고 해당 틀리면 반례를 만들어가며 문제를 풀었음.

0개의 댓글