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 ≤ T ≤ 50 ) 다음 줄부터 테스트케이스의 첫 줄에 정수의 개수 N과 구간의 개수 M 주어진다. ( 10 ≤ N ≤ 100, 2 ≤ M < N )
다음 줄에 N개의 정수 ai가 주어진다. ( 1 ≤ a ≤ 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}")
풀이
내가 생각한 핵심 로직은 다음과 같다:
- "for문을 사용하여 범위 내의 수들을 더하기"
- 위 내용을 리스트와, 반복할 구간의 범위 그리고 증가하는 인덱스까지 총 3개의 매개변수를 입력받아
- 인덱스를 반복하며 범위 내의 숫자들을 더한 값을 순서대로 total이라는 값에 저장하고 리턴하는 함수 addM으로 구현하였다.
def addM(lista, indexM, M):
total = 0
for i in range(M): # M(구간의 개수)
total += lista[indexM + i] # indexM(인덱스)
return total
나머지 코드는 아래와 같이 작성하였다.
- 반복할 횟수를 정해주고,
- addM의 리턴값 total을 순서대로 저장해 줄 리스트 testcase를 선언하였다.
- 그다음 정수의 개수 N과 더해질 구간의 길이 M,
- 그리고 테스트케이스가 될 정수들을 리스트로 입력받는다.
- 이제 addM함수를 몇 번 써야 할지 생각해 보자. 만약 정수의 개수가 10이고, 더해질 구간의 길이가 3이라면
- 우리는 0번째 인덱스부터 7번째 인덱스 즉 총 8개의 인덱스까지만 반복하여 더해주면 된다. 만약 8번째 인덱스(9개)를 포함시키게 된다면 Indexerror: list index out of range 메시지와 마주하게 된다.
- 그래서 범위를 N - (M - 1)로 지정한 것이다. 이는 N - M + 1로 이해하는 것이 더 쉽겠다.
- 그 범위 안에서 입력받은 lista와, indexM과 구간의 범위 M의 값을 addM의 매개변수로 넣어주고(중요)
- testcase안에 순서대로 넣어준다.
- testcase의 max와 min을 구한 뒤 원하는 형식으로 출력해 주면
- fin~
느낀 점
핵심 로직을 이해한 상태로 전체적인 틀을 자세하게 짠 다음 코딩을 시작하는 것이 간결하고 직관적인 코드를 짜는 데 필수적이라는 것을 점점 더 깨닫는 중이다.
불필요함이 존재하지 않는, 지금보다 더 깔끔한 코드를 짜려고 한다.
'Algorithm > SWEA' 카테고리의 다른 글
[SW Expert Academy] 1218번 괄호 짝짓기 [파이썬 S/W 문제해결 기본] (0) | 2024.04.07 |
---|---|
[SW Expert Academy] 1206번 [S/W 문제해결 기본] (python) (4) | 2024.03.17 |
댓글