HeoBrain AI · DEV · GROWTH

HEO BRAIN · DEV LAB

배운 것을 구조화하고,
실제로 작동하게 만듭니다.

AI, 코딩, 영어, 포트폴리오를 직접 공부하고 만들며 얻은 지식을 누구나 다시 써먹을 수 있게 정리합니다.

heobrain.workflow LIVE
01 collect(experience) 02 structure(knowledge) 03 ship(something useful)

EMAIL NEWSLETTER

새 글을 이메일로 받아보세요

하루 동안 올라온 HeoBrain의 새 글을 매일 오후 8시에 한 통으로 보내드립니다.

인증 이메일의 링크를 눌러야 구독이 완료되며, 언제든 해지할 수 있습니다.

LATEST NOTES

최근에 정리한 글

모든 글 보기

Day22)프로그래머스: 함수(메서드), 조건문 활용

이 글의 목차 펼치기

Python 코딩테스트 학습 기록 | Day 22 함수(메서드), 조건문 활용

오늘은 문자열 앞의 0 처리, 100,000자리 큰 수 덧셈, 형변환, 배열 필터링, 부분 문자열 확인을 정리했다. 특히 큰 수 덧셈은 파이썬의 형변환만으로 끝낼 수 있을 것 같지만, 입력 길이 때문에 직접 자리 올림을 구현해야 했다.

오늘 푼 문제

프로그래머스 Day 22 공식 링크
문제 핵심 개념
0 떼기lstrip()
두 수의 합큰 수 덧셈, carry
문자열로 변환str()
배열의 원소 삭제하기필터링, remove()
부분 문자열인지 확인하기in, bool, int

1. 0 떼기

문자열의 왼쪽에서 연속으로 등장하는 0만 제거하고, 결과도 문자열로 반환하는 문제다.

def solution(n_str):
    return n_str.lstrip("0")

lstrip("0")은 왼쪽 끝의 0만 제거한다. "0010""10"이 되고, "854020"은 그대로다. 결과가 문자열이므로 숫자로 바꿨다가 다시 문자열로 만들 필요가 없다.

2. 두 수의 합: 100,000자리 큰 수 더하기

두 정수가 문자열로 주어지고 각각 최대 100,000자리다. 결과 역시 문자열로 반환해야 한다.

처음 떠올린 짧은 풀이

def solution(a, b):
    return str(int(a) + int(b))

일반적인 파이썬에서는 자연스러운 코드지만, Python 3.11 이상에서는 긴 문자열을 정수로 바꿀 때 자릿수 제한이 적용될 수 있다. 이 문제처럼 100,000자리 입력이 들어오면 int(a)에서 오류가 날 수 있어 제출 풀이로는 적합하지 않다.

처음 작성한 수제 덧셈

def solution(a, b):
    c = ''
    for i in a[::-1]:
        for j in b[::-1]:
            if i == j:
                c[i] = a[i] + b[i]
    return c

잘못된 점

덧셈은 같은 자릿수끼리 한 번씩 계산한다. 모든 자릿수 조합을 비교하는 이중 반복문은 필요 없다.

for i in a[::-1]의 i에는 인덱스가 아니라 "3" 같은 문자 값이 들어간다.

문자열은 불변 자료형이라 c[i] = ...처럼 중간 글자를 바꿀 수 없다.

7 + 5 = 12일 때 2는 현재 자리에 쓰고, 1은 다음 자리로 넘기는 carry가 필요하다.

수정한 기본 풀이

def solution(a, b):
    max_len = max(len(a), len(b))
    a = a.zfill(max_len)
    b = b.zfill(max_len)

    result = []
    carry = 0

    for i in range(max_len - 1, -1, -1):
        total = int(a[i]) + int(b[i]) + carry
        carry = total // 10
        result.append(str(total % 10))

    if carry:
        result.append(str(carry))

    return ''.join(reversed(result))

zfill()은 짧은 문자열의 앞을 0으로 채워 자릿수를 맞춘다. "45".zfill(3)"045"다. 1의 자리부터 거꾸로 더하며, total % 10은 현재 자리, total // 10은 다음 자리로 넘길 carry다.

문자열 앞에 계속 더하면 매번 새 문자열이 만들어진다. 결과는 리스트에 append()로 담고 마지막에 ''.join()을 한 번만 실행하는 편이 100,000자리 입력에서 효율적이다.

검산: 15 + 7

"15""7""15", "07"로 맞춘다. 5 + 7 = 12이므로 2를 결과에 담고 carry는 1이다. 다음 자리에서 1 + 0 + 1 = 2가 된다. 결과 리스트 ["2", "2"]를 뒤집어 합치면 "22"다.

3. 문자열로 변환

def solution(n):
    answer = str(n)
    return answer

정수를 문자열로 바꾸는 str()를 정확히 사용한 풀이이다. 중간 변수가 필요하지 않다면 바로 반환할 수 있다.

def solution(n):
    return str(n)

4. 배열의 원소 삭제하기

처음 작성한 코드

def solution(arr, delete_list):
    answer = []
    for i in delete_list:
        if i in arr:
            answer = arr.remove(i)
            return answer

remove()는 원본 리스트에서 값을 지우지만 반환값은 None이다. 따라서 answer = arr.remove(i)를 쓰면 answer가 None이 된다. 또한 return이 반복문 안에 있으면 첫 삭제 뒤에 함수가 끝난다.

기본 수정 풀이

def solution(arr, delete_list):
    answer = []

    for value in arr:
        if value not in delete_list:
            answer.append(value)

    return answer

더 간단한 풀이

def solution(arr, delete_list):
    return [value for value in arr if value not in delete_list]

원본 배열을 순서대로 읽으며 남길 값만 새 리스트에 담으므로 원래 순서가 유지된다.

5. 부분 문자열인지 확인하기

def solution(my_string, target):
    return int(target in my_string)

target in my_string은 target이 연속된 부분 문자열이면 True, 아니면 False를 반환한다. 파이썬에서 int(True)는 1, int(False)는 0이다.

def solution(my_string, target):
    return 1 if target in my_string else 0

실수 방지 체크리스트

큰 수의 자릿수 제한을 먼저 보고, 문자열을 무조건 int로 바꾸지 않는다.

문자열을 순회할 때 반복 변수는 인덱스가 아니라 문자 값이다.

문자열은 불변이므로 결과를 리스트에 모아 마지막에 join한다.

remove()의 반환값은 None이며, return 들여쓰기를 확인한다.

같이 보면 좋은 글

다음에는 for와 if를 함께 쓰는 필터링, 리스트 컴프리헨션, 문자열의 split()과 join()을 복습하면 오늘의 배열 삭제와 큰 수 덧셈 풀이가 더 자연스럽게 연결된다.

EMAIL NEWSLETTER

새 글을 이메일로 받아보세요

하루 동안 올라온 HeoBrain의 새 글을 매일 오후 8시에 한 통으로 보내드립니다.

인증 이메일의 링크를 눌러야 구독이 완료되며, 언제든 해지할 수 있습니다.

블로그 검색