본문 바로가기
AI/Coding_Test

Day5) Programmers Coding Test

by 거대웅 TitanBear 2026. 7. 11.

프로그래머스 코딩 기초 트레이닝

코드 처리하기, 등차수열, 주사위 게임 2, 리스트 문제 풀이 정리

이번 글에서는 프로그래머스 코딩 기초 트레이닝 문제 중에서 조건 전환, 등차수열 누적, 같은 값 판별, 리스트의 합과 곱, 홀짝 이어 붙이기를 정리했습니다. 문제 자체는 짧지만 직접 풀어보면 ===, 문자열 '1'과 숫자 1, 곱셈 초기값, 반복문 안팎의 비교 위치처럼 헷갈리는 부분이 계속 나옵니다.

그래서 정답 코드만 적기보다, 제가 헷갈렸던 지점을 먼저 짚고 기본 풀이와 더 간단한 풀이를 함께 정리했습니다.

핵심 1 mode 전환과 문자열 누적
핵심 2 등차수열과 조건 누적
핵심 3 set, 합, 곱, 홀짝 분리
오늘 문제들의 공통점은 “문제를 읽은 그대로 변수와 조건으로 옮기는 연습”이었습니다.

이 글의 풀이 순서

  1. 문제 및 프로그래머스 공식 링크
  2. 내 풀이
  3. 설명 및 잘못된 점
  4. 기본 수정 풀이
  5. 여러 더 간편한 풀이와 설명
  6. 입출력 예로 검산하기

1. 문제 및 프로그래머스 공식 링크

이번 글에서 정리한 문제는 모두 프로그래머스 코딩 기초 트레이닝 문제입니다.

프로그래머스 문제 링크와 핵심 개념
문제 공식 링크 핵심 개념
코드 처리하기 문제 보기 mode 전환, 인덱스 홀짝
등차수열의 특정한 항만 더하기 문제 보기 등차수열 공식, boolean 조건
주사위 게임 2 문제 보기 세 값이 같은지 판별
원소들의 곱과 합 문제 보기 곱 초기값, 합의 제곱
이어 붙인 수 문제 보기 홀수와 짝수 문자열 분리

2. 코드 처리하기: mode, '1', ret, answer 헷갈리지 않기

문제 요약

문자열 code를 앞에서부터 읽으면서 문자가 '1'이면 mode를 0에서 1로, 또는 1에서 0으로 바꾸는 문제입니다. mode가 0일 때는 짝수 인덱스의 문자를, mode가 1일 때는 홀수 인덱스의 문자를 결과 문자열에 붙입니다. 마지막 결과가 빈 문자열이면 "EMPTY"를 반환해야 합니다.

설명 및 잘못된 점

  • mode는 처음에 0으로 시작해야 합니다.
  • code[i]는 문자열이므로 숫자 1이 아니라 문자열 '1'과 비교해야 합니다.
  • mode == 1은 비교이고, mode = 1은 값을 바꾸는 대입입니다. 상태를 바꿀 때는 =를 써야 합니다.
  • 문제 설명에는 결과 문자열을 ret라고 부르지만, 파이썬 기본 코드에서는 보통 answer를 사용합니다. 중요한 것은 변수 이름을 하나로 통일하는 것입니다. ret를 따로 만들지 않았는데 answer = ret + code[idx]처럼 쓰면 오류가 납니다.
  • idx를 쓸지 i를 쓸지도 통일해야 합니다. 반복문에서 for i in ...라고 했다면 본문에서도 code[i]를 쓰는 편이 안전합니다.
= 와 == 차이

=는 변수에 값을 넣는 대입입니다. 예를 들어 mode = 1mode 값을 1로 바꿉니다. 반대로 ==는 두 값이 같은지 확인하는 비교입니다. 예를 들어 mode == 1mode가 1인지 묻는 조건식입니다.

기본 수정 풀이

def solution(code):
    answer = ''
    mode = 0

    for i in range(len(code)):
        if mode == 0:
            if code[i] != '1':
                if i % 2 == 0:
                    answer += code[i]
            else:
                mode = 1
        elif mode == 1:
            if code[i] != '1':
                if i % 2 != 0:
                    answer += code[i]
            else:
                mode = 0

    if answer == '':
        return "EMPTY"

    return answer

여기서 elif를 사용하면 한 번의 반복에서 mode가 바뀐 뒤 곧바로 다음 조건까지 이어서 실행되는 흐름을 막을 수 있어 읽기 좋습니다.

더 간단한 풀이

def solution(code):
    return "".join(code.split("1"))[::2] or "EMPTY"

이 풀이는 처음 보면 갑자기 느껴질 수 있습니다. 핵심은 '1'을 기준으로 mode가 바뀌고, '1'을 제거한 뒤에는 선택해야 할 문자가 짝수 위치에 남는다는 점입니다. 그래도 처음 공부할 때는 위의 기본 풀이처럼 mode를 직접 바꿔보는 방식이 더 이해하기 쉽습니다.

3. 등차수열의 특정한 항만 더하기: included가 True인 항만 누적하기

문제 요약

첫째항이 a, 공차가 d인 등차수열이 있을 때, included[i]True인 항만 더하는 문제입니다. 인덱스 i에서의 항은 a + d * i입니다.

내 풀이

def solution(a, d, included):
    answer = 0

    for i in range(len(included)):
        if included[i] == True:
            answer += a + (d * i)

    return answer

설명 및 잘못된 점

반복 범위는 included 자체가 아니라 len(included)로 잡아야 합니다. 그리고 included[i] == True는 틀린 표현은 아니지만, 파이썬에서는 if included[i]:처럼 더 간단하게 쓸 수 있습니다. 가장 중요한 부분은 등차수열의 i번째 값을 a + d * i로 계산하는 것입니다.

더 간단한 풀이

def solution(a, d, included):
    return sum(a + d * i for i in range(len(included)) if included[i])

또는 True가 1, False가 0처럼 계산된다는 점을 이용하면 이렇게도 쓸 수 있습니다.

def solution(a, d, included):
    answer = 0
    for i in range(len(included)):
        answer += (a + d * i) * int(included[i])
    return answer

4. 주사위 게임 2: 두 숫자만 같은 모든 경우를 확인하기

문제 요약

세 숫자 a, b, c가 모두 다르면 합만 반환하고, 두 숫자만 같으면 합과 제곱합을 곱하고, 세 숫자가 모두 같으면 합, 제곱합, 세제곱합을 모두 곱하는 문제입니다.

처음 작성한 코드

def solution(a, b, c):
    answer = 0
    if a == b == c:
        answer = (a + b + c) * (a**2 + b**2 + c**2) * (a**3 + b**3 + c**3)
    elif a == b:
        if a != c:
            answer = (a + b + c) * (a**2 + b**2 + c**2)
    else:
        answer = a + b + c
    return answer

설명 및 잘못된 점

이 코드의 핵심 문제는 두 숫자만 같은 경우를 a == b만 확인했다는 점입니다. 실제로는 a == b, b == c, a == c 세 가지 경우가 모두 가능합니다.

기본 수정 풀이

def solution(a, b, c):
    if a == b == c:
        return (a + b + c) * (a**2 + b**2 + c**2) * (a**3 + b**3 + c**3)
    elif a == b or b == c or a == c:
        return (a + b + c) * (a**2 + b**2 + c**2)
    else:
        return a + b + c

더 간단한 풀이

def solution(a, b, c):
    count = len(set([a, b, c]))

    if count == 1:
        return (a + b + c) * (a**2 + b**2 + c**2) * (a**3 + b**3 + c**3)
    elif count == 2:
        return (a + b + c) * (a**2 + b**2 + c**2)
    else:
        return a + b + c

set([a, b, c])는 중복을 제거합니다. 길이가 1이면 세 숫자가 모두 같고, 길이가 2이면 두 숫자만 같고, 길이가 3이면 모두 다릅니다. 사용자가 적은 3*a*3*(a**2)*3*(a**3)도 세 숫자가 모두 같을 때는 계산 결과가 맞지만, 공식의 모양이 바로 보이지 않기 때문에 위처럼 원래 식을 유지하는 편이 읽기 좋습니다.

5. 원소들의 곱과 합: 곱은 1로 시작해야 한다

문제 요약

리스트의 모든 원소를 곱한 값이 모든 원소의 합을 제곱한 값보다 작으면 1, 아니면 0을 반환하는 문제입니다.

처음 작성한 코드

def solution(num_list):
    answer = 0
    sum_multi = 0
    multi = 0
    for i in range(len(num_list)):
        sum_multi += num_list[i] * num_list[i]
        multi *= num_list[i]
        if sum_multi > multi:
            answer = 1
        else:
            answer = 0
    return answer

설명 및 잘못된 점

  • 곱을 저장하는 변수는 0이 아니라 1로 시작해야 합니다. 0으로 시작하면 무엇을 곱해도 계속 0입니다.
  • 문제는 원소의 제곱합이 아니라, 원소들의 합을 구한 뒤 그 합을 제곱해야 합니다.
  • 비교는 반복문 안에서 매번 하는 것이 아니라, 모든 합과 곱을 구한 뒤 마지막에 한 번만 하면 됩니다.

기본 수정 풀이

def solution(num_list):
    sum_val = 0
    multi = 1

    for num in num_list:
        sum_val += num
        multi *= num

    if multi < (sum_val ** 2):
        return 1
    else:
        return 0

더 간단한 풀이

def solution(num_list):
    a = 1
    b = 0

    for x in num_list:
        a *= x
        b += x

    if a < b * b:
        return 1
    return 0

여기서 a는 곱, b는 합입니다. 변수명을 더 명확하게 쓰고 싶다면 product, total처럼 바꿔도 좋습니다.

6. 이어 붙인 수: 홀수 문자열과 짝수 문자열을 따로 만들기

문제 요약

리스트에서 홀수만 순서대로 이어 붙인 수와 짝수만 순서대로 이어 붙인 수를 만든 뒤, 두 수를 더하는 문제입니다.

내 풀이

def solution(num_list):
    answer = 0
    answer1 = ''
    answer2 = ''

    for num in num_list:
        if num % 2 == 0:
            answer1 += str(num)
        if num % 2 != 0:
            answer2 += str(num)

    answer = int(answer1) + int(answer2)
    return answer

설명 및 잘못된 점

이 코드는 결과 합 자체는 맞을 수 있습니다. 다만 문제 설명은 홀수로 만든 수와 짝수로 만든 수를 더하라고 하므로, 변수 이름도 홀수와 짝수를 기준으로 잡는 편이 읽기 좋습니다. 또 짝수와 홀수는 동시에 성립하지 않으므로 두 번째 ifelse로 바꿀 수 있습니다.

기본 수정 풀이

def solution(num_list):
    odd = ''
    even = ''

    for num in num_list:
        if num % 2 != 0:
            odd += str(num)
        else:
            even += str(num)

    return int(odd) + int(even)

더 간단한 풀이

def solution(num_list):
    odd = ''.join(str(num) for num in num_list if num % 2 != 0)
    even = ''.join(str(num) for num in num_list if num % 2 == 0)
    return int(odd) + int(even)

리스트에 홀수와 짝수가 적어도 한 개씩 있다는 조건이 있으므로 int(odd), int(even)을 바로 사용할 수 있습니다.

7. 입출력 예로 빠르게 검산하기

문제별 빠른 검산 예시
문제 예시 결과
코드 처리하기 "abc1abc1abc" "acbac"
등차수열 a=3, d=4, [True, False, False, True, True] 37
주사위 게임 2 a=5, b=3, c=3 473
원소들의 곱과 합 [3, 4, 5, 2, 1] 1
이어 붙인 수 [3, 4, 5, 2, 1] 393

8. 실수 방지 체크리스트

  • =는 값을 넣는 연산자, ==는 같은지 비교하는 연산자다.
  • 문자열의 문자와 비교할 때는 '1'처럼 따옴표를 붙인다.
  • 문제 설명의 ret와 실제 코드의 answer를 섞어 쓰지 않는다.
  • 곱을 누적할 때 초기값은 0이 아니라 1이다.
  • 반복문으로 값을 모두 만든 뒤 비교해야 하는 문제인지 확인한다.
  • 두 숫자만 같은 경우는 a == b 하나만이 아니라 b == c, a == c도 확인한다.

9. 같이 보면 좋은 글

  • 파이썬 if문 기초: 조건이 여러 갈래로 나뉘는 문제를 풀 때 도움이 됩니다.
  • 문자열 누적과 join 사용법: 문자열을 하나씩 붙이는 문제에서 자주 나옵니다.
  • range, enumerate, 인덱스 사용법: 인덱스 홀짝을 확인해야 하는 문제와 잘 연결됩니다.
  • set으로 중복 제거하기: 같은 값이 몇 종류인지 확인할 때 유용합니다.

마무리

이번 문제들은 어려운 알고리즘보다 기본 문법을 정확히 쓰는 연습에 가까웠습니다. 특히 ===, 문자열과 숫자 비교, 곱의 초기값, 변수 이름 통일은 초반에 자주 틀리는 부분이라 따로 기록해둘 만했습니다.

다음에 비슷한 문제를 풀 때는 먼저 “무엇을 누적하는지”, “초기값이 무엇이어야 하는지”, “조건 비교와 값 변경을 헷갈리지 않았는지”부터 확인하려고 합니다. 이렇게 체크 순서를 만들어두면 코드가 훨씬 안정적으로 정리됩니다.