본문 바로가기
Algorithm/SWEA

[SW Expert Academy] 4835번 구간합 [파이썬 S/W 문제해결 기본]

by eoieiie 2024. 3. 18.

 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제


N개의 정수가 들어있는 배열에서 이웃한 M개의 합을 계산하는 것은 디지털 필터링의 기초연산이다.
M개의 합이 가장 큰 경우와 가장 작은 경우의 차이를 출력하는 프로그램을 작성하시오.

다음은 N=5, M=3이고 5개의 숫자 1 2 3 4 5가 배열 v에 들어있는 경우이다.
 

v 1 2 3 4 5

 

v 1 2 3 4 5


이웃한 M개의 합이 가장 작은 경우 1 + 2 + 3 = 6
 

v 1 2 3 4 5


이웃한 M개의 합이 가장 큰 경우 3 + 4 + 5 = 12

답은 12와 6의 차인 6을 출력한다.

 

입력


첫 줄에 테스트 케이스 개수 T가 주어진다.  ( 1 ≤ ≤ 50 ) 다음 줄부터 테스트케이스의 첫 줄에 정수의 개수 N과 구간의 개수 M 주어진다. ( 10 ≤ ≤ 100,  2 ≤ M < N )

다음 줄에 N개의 정수 ai가 주어진다. ( 1 ≤ ≤ 10000 )

 

정답코드


def addM(lista, indexM, M):

    total = 0
    for i in range(M):  # M(구간의 개수)
        total += lista[indexM + i]  # indexM(인덱스)

    return total


repeat = int(input())

for i in range(repeat):

    testcase = []

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

    for indexM in range(N - (M - 1)):
        testcase.append(addM(lista, indexM, M))

    maxvalue = max(testcase)
    minvalue = min(testcase)

    print(f"#{i+1} {maxvalue-minvalue}")

 

풀이


내가 생각한 핵심 로직은 다음과 같다:

 

  1. "for문을 사용하여 범위 내의 수들을 더하기"

  2. 위 내용을 리스트와, 반복할 구간의 범위 그리고 증가하는 인덱스까지 총 3개의 매개변수를 입력받아
  3. 인덱스를 반복하며 범위 내의 숫자들을 더한 값을 순서대로 total이라는 값에 저장하고 리턴하는 함수 addM으로 구현하였다.
def addM(lista, indexM, M):

    total = 0
    for i in range(M):  # M(구간의 개수)
        total += lista[indexM + i]  # indexM(인덱스)

    return total

 

나머지 코드는 아래와 같이 작성하였다. 

 

  1. 반복할 횟수를 정해주고, 
  2. addM의 리턴값 total을 순서대로 저장해 줄 리스트 testcase를 선언하였다. 
  3. 그다음 정수의 개수 N과 더해질 구간의 길이 M, 
  4. 그리고 테스트케이스가 될 정수들을 리스트로 입력받는다. 

  5. 이제 addM함수를 몇 번 써야 할지 생각해 보자. 만약 정수의 개수가 10이고, 더해질 구간의 길이가 3이라면 
  6. 우리는 0번째 인덱스부터 7번째 인덱스 즉 총 8개의 인덱스까지만 반복하여 더해주면 된다. 만약 8번째 인덱스(9개)를 포함시키게 된다면 Indexerror: list index out of range 메시지와 마주하게 된다.
  7. 그래서 범위를 N - (M - 1)로 지정한 것이다. 이는 N - M + 1로 이해하는 것이 더 쉽겠다. 

  8. 그 범위 안에서 입력받은 lista와, indexM과  구간의 범위 M의 값을 addM의 매개변수로 넣어주고(중요)
  9. testcase안에 순서대로 넣어준다. 
  10. testcase의 max와 min을 구한 뒤 원하는 형식으로 출력해 주면 
  11. fin~

 

느낀 점


핵심 로직을 이해한 상태로 전체적인 틀을 자세하게 짠 다음 코딩을 시작하는 것이 간결하고 직관적인 코드를 짜는 데 필수적이라는 것을 점점 더 깨닫는 중이다.  

불필요함이 존재하지 않는, 지금보다 더 깔끔한 코드를 짜려고 한다.

 

 

댓글