청야에몽
청야의 개발 일기
청야에몽
전체 방문자
오늘
어제
  • 분류 전체보기 (156)
    • os (4)
      • Linux (4)
    • Language (32)
      • Python (15)
      • C# (6)
      • Java (11)
    • BaekJoon (92)
      • 단계별로 풀어보기 (81)
      • 누적합 (11)
    • Test (6)
      • 코딩테스트 (6)
      • 42 SEOUL (0)
    • Project (9)
      • 충돌, 피하기 게임 (8)
      • Unreal engine5 CICD 구축 (1)
    • Git & GitHUB (9)
    • Cloud (3)
      • AWS (0)
      • Azure (0)
      • Docker (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Reset
  • docker
  • 자료형
  • 누적 합
  • 중첩for문
  • c#
  • java
  • Rebase
  • git
  • Revert
  • 백준
  • 파이썬
  • Linux
  • 재귀 함수
  • Python
  • 연산자
  • 리눅스
  • pygame
  • 누적합
  • for문

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
청야에몽

청야의 개발 일기

BaekJoon/누적합

[백준] 순서쌍의 곱의 합 - 13900번 문제 (Python)

2023. 3. 26. 21:23
728x90

https://www.acmicpc.net/problem/13900

 

13900번: 순서쌍의 곱의 합

첫 번째 줄에는 입력 받을 정수의 개수 N(2 ≤ N ≤ 100,000) 두 번째 줄에는 N 개의 정수가 주어진다. 이때 입력 받는 정수들의 범위는 0이상 10,000 이하이다.

www.acmicpc.net


문제

N개의 정수 중 서로 다른 위치의 두 수를 뽑는 모든 경우의 두 수의 곱의 합을 구하라.

예를 들어 N = 3이고 주어진 정수가 2, 3, 4일 때, 두 수를 뽑는 모든 경우는 (2, 3), (2, 4), (3, 4)이며 이때 각각의 곱은 6, 8, 12이다. 따라서 총합은 26이다.

입력

첫 번째 줄에는 입력 받을 정수의 개수 N(2 ≤ N ≤ 100,000)

두 번째 줄에는 N 개의 정수가 주어진다. 이때 입력 받는 정수들의 범위는 0이상 10,000 이하이다.

출력

모든 경우의 곱의 합을 출력한다.

코드 정답

처음 틀린 코드

import sys
input = sys.stdin.readline

# 13900
n = int(input())
num = list(map(int, input().split()))
li = []

for i in range(n-1):
    for j in range(i+1, n):
        li.append(num[i] * num[j])

print(sum(li))

수정 코드

import sys
input = sys.stdin.readline

# 13900
n = int(input())
num = list(map(int, input().split()))
result = 0
acc = 0

for i in range(n):
    result += num[i] * acc
    acc += num[i]

print(result)

풀이

처음에는 단순히 시간 복잡도와 메모리 초과를 신경쓰지 않고 코드를 짜보았다.  첫 번째 행에서는 정수값을 입력받고 두 번째 행에서는 정수값을 여러개 입력받아 띄워쓰기를 기준으로 분류하여 리스트 형식으로 만들어냈다. 이후 반복문을 사용하여 계산된 값을 li 라는 변수에 순차적으로 인덱스에 값을 추가시킨 후 변수 li에 존재하는 값을 모두 더한 값을 출력하였다. 이렇게 할 시 값은 맞지만 당연히 메모리 초과와 시간 초과라는 오류가 발생하게 되었다.

 

그렇기 때문에 코드를 수정하여보았다. 똑같이 정수값을 입력받았지만 result 와 acc 라는 변수를 0이라는 초기값을 가지게 한 채로 만들었다. 이후 반복문을 사용하여 num 배열에 저장된 인덱스 값과 acc 값을 곱한 값을 result 라는 변수에 저장하였고 다음 행에는 num[i] 에 저장되어 있는 값을 acc 값과 더하여 acc에 저장하였다. 반복문이 끝나게 된다면 result 에 저장된 값을 출력해주었다. 이렇게 한다면 이중 for 문을 사용하지 않아 시간 복잡도가 감소되고 메모리 초과 부분을 잡아낼 수 있게 된다.

728x90
저작자표시 비영리 변경금지 (새창열림)

'BaekJoon > 누적합' 카테고리의 다른 글

[백준] 블로그 - 21921번 문제 (Python)  (0) 2023.03.31
[백준] 합 구하기 - 11441번 문제 (Python)  (0) 2023.03.30
[백준] Maximum Subarray - 10211번 문제 (Python)  (0) 2023.03.24
[백준] 2차원 배열의 합 - 2167번 문제 (Python)  (0) 2023.03.23
[백준] 기상청 인턴 신현수 - 2435번 문제 (Python)  (0) 2023.03.21
    'BaekJoon/누적합' 카테고리의 다른 글
    • [백준] 블로그 - 21921번 문제 (Python)
    • [백준] 합 구하기 - 11441번 문제 (Python)
    • [백준] Maximum Subarray - 10211번 문제 (Python)
    • [백준] 2차원 배열의 합 - 2167번 문제 (Python)
    청야에몽
    청야에몽
    개인적으로 학습을 하여 까먹지 않기 위해 올리는 블로그입니다.

    티스토리툴바