프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문자열 s가 "1"이 될 때까지 0을 제거하고, 남은 문자열의 길이를 다시 2진법으로 변환하는 과정을 반복하는 문제입니다. 변환 횟수와 제거된 0의 총 개수를 구하는 것이 목적입니다.
1. 나의 풀이
문제에서 정의한 '이진 변환'을 루프 내에서 구현하여 최종 결과값을 도출했습니다.
def solution(s):
# [변환 횟수, 제거된 0의 개수]
answer = [0, 0]
while s != "1":
# 1. 현재 문자열에서 0의 개수를 카운트하여 누적
zero_count = s.count("0")
answer[1] += zero_count
# 2. 0을 제거한 후의 길이를 측정
# 전체 길이에서 0의 개수를 빼는 '같은 논리'를 적용할 수 있습니다
new_length = len(s) - zero_count
# 3. 길이를 2진법 문자열로 변환 (접두어 제외)
s = format(new_length, 'b')
# 4. 변환 횟수 증가
answer[0] += 1
return answer
2. 오늘 배운 점 및 복기 노트
문자열 조작의 비용과 논리적 치환
문제 설명에는 "0을 제거한다"라고 명시되어 있어 replace("0", "")를 떠올리기 쉽습니다. 하지만 문자열을 새로 생성하고 합치는 과정은 비용이 발생합니다. 대신 count("0")을 통해 제거될 개수만 파악하고, 전체 길이에서 이를 빼서 다음 단계의 숫자를 구하는 방식이 훨씬 효율적입니다.
파이썬의 진법 변환 도구
bin() 함수는 결과에 0b라는 접두어가 붙기 때문에 슬라이싱 [2:]가 필요합니다.
반면 format(value, 'b')를 사용하면 순수하게 2진수 값만 담긴 문자열을 얻을 수 있어 코드가 깔끔해집니다. 상황에 따라 적절한 함수를 선택하는 능력이 필요합니다.
3. 프로그래머스 코딩 테스트 문제 풀이 전략 교재에서 배울만한 점
임의 정의된 변환과 실제 진법 변환의 구분
문제에서 말하는 '이진 변환'은 우리가 아는 일반적인 수학적 진법 변환에 0 제거라는 특수 규칙이 추가된 형태입니다. 교재에서는 이처럼 문제에서 새롭게 정의한 개념과 기존 알고리즘의 개념을 혼동하지 않고 정확히 구현하는 설계 능력을 강조합니다.
반복되는 코드의 암기 필요성
진법 변환은 코딩 테스트에서 독립적인 문제로 나오기보다 다른 로직의 일부로 포함되는 경우가 많습니다. bin(), int(s, 2), format() 등의 사용법을 외워두면 실제 문제의 핵심 로직(이 문제에서는 변환 조건 제어)에 더 집중할 수 있고 문제 풀이 시간과 체력을 아낄 수 있습니다.
파이썬 진법 및 문자열 처리 핵심 함수 요약
| 분류 | 함수/표현식 | 주요 용도 및 특징 | 예시 결과 (n=10 기준) |
| 진법 변환 (10진수 → n진수) | bin(n) | 2진법 문자열로 변환 (접두어 0b) | '0b1010' |
| oct(n) | 8진법 문자열로 변환 (접두어 0o) | '0o12' | |
| hex(n) | 16진법 문자열로 변환 (접두어 0x) | '0xa' | |
| 포맷팅 (접두어 없는 변환) | format(n, 'b') | 2진법 문자열로 변환 | '1010' |
| format(n, 'o') | 8진법 문자열로 변환 | '12' | |
| format(n, 'x') | 16진법 문자열로 변환 | 'a' | |
| 역변환 (n진수 → 10진수) | int(s, base) | base진법 문자열 s를 10진수 정수로 변환 | int('1010', 2) → 10 |
| 연산 및 추출 | divmod(n, base) | 몫과 나머지를 동시에 반환 (튜플) | divmod(10, 3) → (3, 1) |
| 문자열 처리 | s.count(sub) | 특정 문자/문자열의 개수 확인 | '1100'.count('0') → 2 |
| s[::-1] | 슬라이싱을 이용해 문자열 역순 뒤집기 | 'abc'[::-1] → 'cba' | |
| ''.join(list) | 리스트 내 문자열들을 하나로 결합 | ''.join(['1', 'a']) → '1a' |
1. 진법 변환 시의 자료형 유의사항
- bin(), oct(), hex(), format() 함수는 결과값으로 문자열(String)을 반환합니다.
- int(s, base)의 첫 번째 인자는 반드시 문자열이어야 하며, 반환값은 정수(Integer)입니다.
2. 메모리 효율성
- 문자열을 뒤집을 때 reversed()와 join()을 조합하는 방식보다 s[::-1] 슬라이싱을 사용하는 것이 파이썬 내부적으로 더 빠르게 동작하며 가독성도 우수합니다.
3. divmod의 장점
- num // base와 num % base를 각각 호출하는 것은 두 번의 연산을 수행하지만, divmod는 한 번의 연산으로 두 값을 모두 계산하므로 반복문 내부에서 성능 최적화에 유리합니다.
'알고리즘 > 프로그래머스 문제 풀이 전략' 카테고리의 다른 글
| 문제13 - 신규 아이디 추천 (Python) (0) | 2026.04.26 |
|---|---|
| 문제11 - 3진법 뒤집기 (Python) (0) | 2026.04.26 |
| 문제10 - 문자열 압축 (Python) (0) | 2026.04.24 |
| 문제9 - 짝지어 제거하기 (Python) (0) | 2026.04.23 |
| 문제8 - 튜플 (Python) (0) | 2026.04.23 |
