내일배움캠프

[본캠프] 데이터기반 QA/QC 부트캠프 20일차

min0jun 2026. 6. 9. 20:51

1. 오늘 학습 목표


2. 오늘 학습 한 내용

오늘의 코드카타

오늘도 코드카타 문제 2개를 풀었다.

이번 문제에서는 zip()을 이용해 두 배열을 함께 반복하는 방법과, 반복문을 이용해 약수의 개수를 구하는 방법을 연습한다.

문제에서 요구하는 계산 과정을 순서대로 나누고, 반복문과 조건문으로 옮기는 것이 핵심이다.


1. 내적

문제 설명

길이가 같은 두 정수 배열 a, b가 주어진다.

두 배열의 같은 위치에 있는 값을 각각 곱한 뒤, 모든 결과를 더한 값을 반환하는 문제다.

예를 들어 다음과 같은 두 배열이 있다.

a = [1, 2, 3, 4]
b =
[-3, -1, 0, 2]

같은 위치에 있는 값을 곱하고 모두 더하면 다음과 같다.

1 × (-3) + 2 × (-1) + 3 × 0 + 4 × 2 = 3

따라서 반환값은 3이다.

입출력 예

a = [1, 2, 3, 4]
b =
[-3, -1, 0, 2]
result =
3

a = [-1, 0, 1]
b =
[1, 0, -1]
result =
-2

문제 접근

두 배열의 같은 위치에 있는 값끼리 곱해야 한다.

인덱스를 이용해 각각 접근할 수도 있지만, 파이썬의 zip()을 사용하면 두 배열의 값을 같은 순서로 하나씩 가져올 수 있다.

zip(a, b)를 사용하면 다음과 같이 값이 묶인다.

(1, -3)
(2, -1)
(3, 0)
(4, 2)

각 값을 x, y로 받아서 곱한 뒤 answer에 계속 더하면 된다.

zip()을 사용하면 두 리스트의 같은 위치에 있는 값을 간단하게 함께 반복할 수 있다.

풀이 코드

def solution(a, b):  # 두 정수 배열 a와 b를 입력받는 함수 정의
    answer = 0  # 내적 결과를 저장할 변수

    for x, y in zip(a, b):  # 두 배열의 같은 위치 값을 하나씩 가져옴
        answer += x * y  # 두 값을 곱한 뒤 결과에 누적

    return answer  # 계산한 내적 결과 반환


# solution([1, 2, 3, 4], [-3, -1, 0, 2])  # 결과: 3
# solution([-1, 0, 1], [1, 0, -1])  # 결과: -2

코드 설명

answer = 0

곱한 값을 계속 더하기 위해 결과 변수를 0으로 설정한다.

for x, y in zip(a, b):

배열 ab의 같은 위치에 있는 값을 각각 x, y에 저장한다.

answer += x * y

같은 위치의 두 값을 곱한 뒤 answer에 누적한다.

풀이 정리

처음에는 두 배열을 따로 반복해야 하나 싶었지만, zip()을 사용하면 같은 위치의 값을 한 번에 가져올 수 있다.

이후 두 값을 곱해 answer에 계속 더하면 내적 결과가 완성된다.

이 문제를 통해 zip()이 여러 리스트를 같은 순서로 반복할 때 유용하다는 점을 확인할 수 있다.


2. 약수의 개수와 덧셈

문제 설명

두 정수 leftright가 주어진다.

left부터 right까지의 모든 수를 확인한 뒤 다음 조건에 따라 값을 계산한다.

약수의 개수가 짝수이면 해당 숫자를 더한다.
약수의 개수가 홀수이면 해당 숫자를 뺀다.

예를 들어 left가 13이고 right가 17이라면 다음과 같이 계산한다.

13의 약수 개수: 2개 → 더하기
14의 약수 개수: 4개 → 더하기
15의 약수 개수: 4개 → 더하기
16의 약수 개수: 5개 → 빼기
17의 약수 개수: 2개 → 더하기

따라서 결과는 다음과 같다.

13 + 14 + 15 - 16 + 17 = 43

입출력 예

left = 13
right =
17
result =
43

left = 24
right =
27
result =
52

문제 접근

먼저 left부터 right까지의 숫자를 하나씩 확인한다.

각 숫자마다 1부터 자기 자신까지 나누어보고, 나머지가 0인 경우 약수로 판단한다.

약수를 발견할 때마다 count를 1씩 증가시킨다.

약수 개수를 모두 구한 뒤 다음 조건을 적용한다.

count가 짝수이면 answer에 숫자를 더한다.
count가 홀수이면 answer에서 숫자를 뺀다.

숫자가 바뀔 때마다 약수의 개수를 다시 세어야 하므로 count는 첫 번째 반복문 안에서 0으로 초기화해야 한다.

풀이 코드

def solution(left, right):  # 시작값 left와 끝값 right를 입력받는 함수 정의
    answer = 0  # 최종 계산 결과를 저장할 변수

    for num in range(left, right + 1):  # left부터 right까지 반복
        count = 0  # 현재 숫자의 약수 개수를 저장할 변수

        for i in range(1, num + 1):  # 1부터 현재 숫자 num까지 반복
            if num % i == 0:  # num이 i로 나누어떨어진다면
                count += 1  # 약수 개수를 1 증가

        if count % 2 == 0:  # 약수의 개수가 짝수라면
            answer += num  # 현재 숫자를 결과에 더함
        else:  # 약수의 개수가 홀수라면
            answer -= num  # 현재 숫자를 결과에서 뺌

    return answer  # 최종 계산 결과 반환


# solution(13, 17)  # 결과: 43
# solution(24, 27)  # 결과: 52

코드 설명

for num in range(left, right + 1):

left부터 right까지의 숫자를 하나씩 확인한다.

count = 0

현재 숫자의 약수 개수를 새로 세기 위해 0으로 초기화한다.

for i in range(1, num + 1):

1부터 현재 숫자까지 반복하면서 약수를 확인한다.

if num % i == 0:

현재 숫자가 i로 나누어떨어지면 i는 약수다.

if count % 2 == 0:

약수의 개수가 짝수인지 확인한다.

약수의 개수가 짝수라면 해당 숫자를 더하고, 홀수라면 해당 숫자를 뺀다.

풀이 정리

이 문제는 먼저 각 숫자의 약수 개수를 구한 뒤, 그 개수가 짝수인지 홀수인지 판단하는 문제다.

처음에는 약수를 어떻게 세어야 할지 고민할 수 있지만, 1부터 자기 자신까지 반복하면서 나머지가 0인지 확인하면 된다.

현재 풀이 방식은 모든 숫자를 직접 나누어보므로 이해하기 쉽고 직관적이다.

반복문 안에서 또 다른 반복문을 사용하는 중첩 반복문과 나머지 연산자를 함께 연습할 수 있는 문제다.


나의 간단 소감

- 오늘은 배열의 내적을 구하는 문제와 약수의 개수에 따라 숫자를 더하거나 빼는 문제를 풀었다.

내적 문제에서는 두 배열을 동시에 반복해야 해서 처음에는 인덱스를 사용해야 하나 싶었지만, zip()을 사용하니 코드가 훨씬 간단해진다.

 

두 배열의 같은 위치에 있는 값이 자연스럽게 묶여 들어오기 때문에 계산 과정도 이해하기 쉽다.

파이썬에는 반복 작업을 줄여주는 함수들이 많기 때문에, 문제 상황에 맞는 함수를 알고 사용하는 것도 중요하다는 생각이 든다.

 

약수의 개수와 덧셈 문제는 약수를 직접 세는 과정이 필요해 내적 문제보다 조금 더 복잡하게 느껴진다. 그래도 문제를 약수 개수 구하기와 짝수·홀수 판별하기로 나누어 생각하니 풀이 흐름이 정리된다.

특히 count를 어느 위치에서 초기화해야 하는지가 중요하다. 숫자가 바뀔 때마다 약수의 개수를 새로 세어야 하므로 count = 0을 첫 번째 반복문 안에 넣어야 한다.

 

문제가 길어 보여도 필요한 작업을 순서대로 나누면 생각보다 단순한 코드로 해결할 수 있다.

 

아직 문제를 보자마자 바로 정답 코드가 떠오르지는 않지만, 반복문과 조건문을 어떤 순서로 배치해야 하는지는 조금씩 익숙해진다.

앞으로도 바로 코드를 작성하기보다 문제에서 요구하는 계산 과정을 먼저 정리한 뒤 코드로 옮기는 연습을 계속해야겠다.

 

+오늘은 데이터 인사이트 도출과 시각화하는 과정이었는데, 확실히 인사이트 도출이 가장 중요하면서 어려운것 같다. 프로젝트의 전체적인 방향을 정하는 것이다 보니, 사실 안중요할 수가 없다. 내일까지 완료해야되니 초집중모드 해보겠다.