문제
프로그래머스 / 이진 변환 반복하기
1) 문제 풀이
func solution(_ s:String) -> [Int] {
var count: Int = 0
var result: String = s
var zeroCount: Int = 0
while result != "1" {
count += 1
zeroCount += result.filter { $0 == "0" }.count
let decimalNumber = result.filter { $0 == "1" }.count
result = String(decimalNumber, radix: 2)
}
return [count, zeroCount]
}
결과

2) 코드 개선
❌ 문제점 분석
- 문자열
result의 변환 과정 중 불필요한 연산
result.filter { $0 == "1" }.count는 result에서 1의 개수를 세는데, 결국 1이 몇 개인지만 알면 되는 문제
- 그 다음에 1의 개수를 10진수로 보고 이걸 다시 2진수 문자열로 변환하는 과정을 매번 반복하는데, 이 과정이 비효율적
result != "1"의 조건 검사
result가 "1"이 될 때까지 반복하는데, result가 1인지는 숫자 비교로 하는게 더 명확
- 변수 이름과 역할이 직관적이지 않음
decimalNumber라고 했지만 사실은 1의 개수를 10진수로 해석한 값
zeroCount 변수의 목적이 이해되지만 더욱 명확한 이름이 필요
- 함수 전체적으로 숫자 변환 과정이 문자열로 너무 많이 오감
- 문자열 필터링 -> 숫자 변환 -> 다시 문자열 변환 반복 -> 비효율적
✅ 개선 포인트
- 숫자를 직접 다루는 것이 훨씬 효율적
- 2진수를 정수로 변환해서 계산 후 다시 2진수로 변환하는 과정 최소화
zeroCount를 문자열이 아닌 숫자로 카운팅
- 변수명 명확하게 변경
func solution(_ s: String) -> [Int] {
var count = 0
var zeroCount = 0
var current = s
while current != "1" {
count += 1
let zerosRemoved = current.filter { $0 == "0" }.count
zeroCount += zerosRemoved
let onesCount = current.count - zerosRemoved
current = String(onesCount, radix: 2)
}
return [count, zeroCount]
}
결과
