본문 바로가기

알고리즘 설계/내가 보려고 정리하는 문풀

수들의 합

 

N개의 수로 된 수열 A[1], A[2], ..., A[N]이 있을 때,

이 수열의 i번째 수부터 j번째 수까지의 합 A[i]+A[i+1]+...+A[j-1]+A[j]가 M이 되는 경우의 수를 구하는 프로그램 작성

첫 줄에 N 과 M이 주어지고

두번째 줄에 수열이 주어짐

 

입력예시)

8 3

1 2 1 3 1 1 1 2

 

출력예시)

5


내가 쓴 코드

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

N, M = map(int, input().split())
lst = list(map(int, input().split()))

sum = 0
cnt = 0

for i in range(N):
    sum = lst[i]
    if sum == M:
        cnt += 1
        continue
    elif sum > M:
        continue

    for j in range(i+1, N):
        sum += lst[j]
        if sum == M:
            cnt += 1
            continue
        elif sum > M:
            continue

print(cnt)

 

모범답안

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:
            break
    elif tot == m:
        cnt += 1
        tot -= a[lt]
        lt += 1
    else:
        tot -= a[lt]
        lt += 1

print(cnt)

 

모범답안 보고 느낀점

1. 나와 비슷하면서 다른 답안...

 

2. 인덱스를 가리키는 포인터를 구현하는접근방식 자주 쓰는 듯하다..

나도 익숙해져야지!!!

 

3. 좌측인덱스(시작인덱스) 가리키는 lt, 우측인덱스(끝인덱스) 가리키는 rt

초기 total = list[0]

 

total < M: total rt 가리키는 더하기, rt 1 증가

total = M: cnt 1 증가, total에서 lt 가리키던 값을 빼주고 lt 증가시킴, 그리고 total 다시 Lt 가리키는

total > M: total에서 lt 가리키던 값을 빼주고 lt 증가시킴, 그리고 total 다시 lt 가리키는


다시 써보기

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

N, M = map(int, input().split())
lst = list(map(int, input().split()))

total = lst[0]
cnt = 0

lt = 0
rt = 1

while True:
    if total < M:
        if rt < N:
            total += lst[rt]
            rt += 1
        else:
            break
    elif total == M:
        cnt += 1
        total -= lst[lt]
        lt += 1
    else:
        total -= lst[lt]
        lt += 1

print(cnt)

'알고리즘 설계 > 내가 보려고 정리하는 문풀' 카테고리의 다른 글

사과나무(다이아몬드)  (1) 2024.10.18
격자판 최대합  (3) 2024.10.16
두 리스트 합치기  (4) 2024.10.01
카드 역배치  (0) 2024.10.01
숫자만 추출  (0) 2024.10.01