Python 코딩테스트 학습 기록 | Day 22 함수(메서드), 조건문 활용
오늘은 문자열 앞의 0 처리, 100,000자리 큰 수 덧셈, 형변환, 배열 필터링, 부분 문자열 확인을 정리했다. 특히 큰 수 덧셈은 파이썬의 형변환만으로 끝낼 수 있을 것 같지만, 입력 길이 때문에 직접 자리 올림을 구현해야 했다.
오늘 푼 문제
| 문제 | 핵심 개념 |
|---|---|
| 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()을 복습하면 오늘의 배열 삭제와 큰 수 덧셈 풀이가 더 자연스럽게 연결된다.
'AI > Coding_Test' 카테고리의 다른 글
| Day21)프로그래머스: 정렬, 인덱스 보존, 실수의 정수 부분, 문자열을 숫자로 다루는 방법 (0) | 2026.07.31 |
|---|---|
| Day20)프로그래머: 함수(메서드) (0) | 2026.07.30 |
| Day19)programmers-문자열 분리, 반복 추가, 빈 배열 추가·삭제, 스택, K개 수 뽑기 (0) | 2026.07.30 |
| Day18)파이썬 if와 for의 순서: 필터링, 변환, 분기까지 초보자 정리 (0) | 2026.07.28 |
| Day 15) 프로그래머스 파이썬 조건 변환과 반복문 5문제 풀 (1) | 2026.07.23 |