알고리즘/인프런: 파이썬 알고리즘 문제풀이

탐색&시뮬레이션 문제 #5. 수들의 합

bearbrick 2022. 5. 27. 19:30

*이 풀이는 인프런: 파이썬 알고리즘 문제풀이 강좌에 기반하였습니다.

 

 

 

내 풀이 ( 80점, 마지막 문제 시간 초과) : O( N^2 )

 

1. i번째부터 수를 순차적으로 더해 나가다가 그 합이 m이 되는 경우, cnt값을 증가시키고 break를 통해 시작위치(i)를 다음 칸으로 옮긴다.

2. 합이 m보다 큰 경우, 더이상 더해봤자 의미없으므로 break를 해서 시작위치(i)를 다음 칸으로 옮긴다.

 

import sys
#sys.stdin=open("input.txt","rt")

n,m=map(int, input().split())
arr=list(map(int,input().split()))

cnt=0
sum=0

for i in range(n):
    sum=0
    for j in range(i,n):
         sum+=arr[j]
         if sum==m:
            cnt+=1
            break
         elif sum>m:
            break
print(cnt)

 

 

 

강사님 풀이 : O( N )

 

import sys
#sys.stdin=open("input.txt","rt")

n,m=map(int, input().split())
a=list(map(int,input().split()))

lt=0
rt=1
tot=a[0]
cnt=0

while True:
    if tot<m:
        if rt<n:
            tot+=a[rt]
            rt+=1
        else: #rt=n
            break
    elif tot==m:
        cnt+=1
        tot-=a[lt] #'-'연산에 의해서 결국 마지막에는 모두 tot<m의 경우로 귀결된다. 
        lt+=1
    else: #tot>m
        tot-=a[lt]
        lt+=1

print(cnt)

 

 

 

배운 점

 

1. 1차원 배열을 탐색하는 경우, 포인터(변수를 포인터처럼 사용)를 이용해서 배열에서 원하는 값을 가리키게 하자.

 

2. 1차원 배열의 순차 탐색인 경우, 포인터를 사용해서 충분히 O(N) 으로 해결할 수 있다. 내 풀이는 이중 for문으로 O(N^2)의 시간복잡도를 가지게 되어, 마지막 문제에서 시간 초과가 났다. O(N^2)은 파이썬에서 시간 초과가 나는 경우가 많기 때문에, 1차원 배열에서 이중 for문은 왠만해서 사용하지 않도록 한다.