코팅테스트/백준 문제 모음
SWEA 1959 파이썬 문제풀이(두 개의 숫자열)
유지광이
2022. 2. 6. 02:02
728x90
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpoFaAS4DFAUq
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
이 문제도 간단한 구현문제이다. 단, Ai 와 Bj 중 어느 리스트의 길이가 더 긴지 모르므로 우선 Ai의 길이가 Bj 길이보다 적다고 가정을 하고 코드를 구현하고 if문으로 Ai가 길경우 Bj리스트를 Ai로 Ai리스트를 Bj로 변경해주는 코드를 삽입해준다.
def solution(Ai, Bj):
result = [] # 곱의 합들을 저장할 리스트
if len(Ai) > len(Bj): # 만약 Ai의 길이가 Bj보다 더 길다면
Ai, Bj = Bj, Ai # 둘 리스트를 바꿔준다.
start_j = 0 # 긴 길이를 가진 리스트 인덱스를 계산할 변수 선언 및 초기화
while True:
i = 0 # 짧은 길이를 가진 리스트 인덱스를 계산할 변수 선언 및 0 초기화
j = start_j # 긴 길이를 가진 리스트 인덱스를 start_j로 바꿔준다.
temp = [] # 곱들을 저장할 임시 리스트
while True:
temp.append(Ai[i] * Bj[j]) # 같은 인덱스를 곱해준다.
i += 1 # 길이가 더 짧은 리스트의 인덱스를 +1 씩해준다.
j += 1 # 길이가 더 긴 리스트의 인덱스를 +1 씩해준다.
if i == len(Ai): # 만약 길이가 더 짧은 리스트의 인덱스가 끝에 도달했다면
result.append(sum(temp)) # 곱들의 합을 추가해준다.
start_j += 1 # 길이가 긴 인덱스는 그다음인덱스부터 비교해야 하므로 +1해주고
break # 반복문 탈출
if len(result) == (len(Bj) - len(Ai) + 1): # 만약 저장된 곱들의 합이 두리스트 길이의 차 + 1만큼 추가가 되었다면
print(f'#{order} {max(result)}') # 출력
return
T = int(input())
for order in range(1, T + 1):
N, M = map(int, (input().split()))
Ai = list(map(int, input().split()))
Bj = list(map(int, input().split()))
solution(Ai, Bj) #함수 실행
다음은 for문을 이용한 더 깔끔한 코드이다.
T = int(input())
for order in range(T):
N, M = map(int, input().split())
Ai = list(map(int, input().split()))
Bj = list(map(int, input().split()))
if N > M:
Ai, Bj = Bj, Ai
N, M = M, N
result = []
for i in range(M - N + 1):
temp = []
for j in range(N):
temp.append(Ai[j] * Bj[i + j])
result.append(sum(temp))
print(f'#{order + 1} {max(result)}')
728x90