Algorithm / 이진 변환 반복하기

알고리즘 코드카타

목록 보기
30/59

문제

프로그래머스 / 이진 변환 반복하기

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" }.countresult에서 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
        
        // 0 제거 개수
        let zerosRemoved = current.filter { $0 == "0" }.count
        zeroCount += zerosRemoved
        
        // 1의 개수로 숫자 변환 (10진수)
        let onesCount = current.count - zerosRemoved
        
        // 1의 개수를 2진수 문자열로 변환
        current = String(onesCount, radix: 2)
    }

    return [count, zeroCount]
}

결과

profile
이유있는 코드를 쓰자!!

0개의 댓글