ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스/JAVA] 이진 변환 반복하기
    Algorithm/Java 2024. 10. 30. 15:32

     

    https://school.programmers.co.kr/learn/courses/30/lessons/70129?language=java

     

    프로그래머스

    SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

    programmers.co.kr

     

    📌 문제 요약 

     

    0과 1로 이루어진 문자열 s를 변환하여 s가 "1"이 될 때까지 다음 과정을 반복:

    1. 문자열에서 모든 0 제거
    2. 제거 후 문자열의 길이를 2진법으로 변환

    최종적으로 변환 횟수와 제거된 0의 개수를 반환하는 문제.



    [ 오답 노트 ]


    ❌ 기존 오답 코드

    class Solution {
        public int[] solution(String s) {
            int[] answer = new int[2];
            int count = 0;
            
            while(true) { // s가 모두 1이 될때까지 반복(0이 없어질때까지)
               String str = ""; 
                
               // 1. 원래 수에서 0제거하기 
               for(int i = 0; i < s.length(); i++) {
                   if(s.charAt(i) == 1) { 
                       str += "1"; 
                   }
               } // 1111 나옴
    
               // 2. 2진법으로 변환하기  
               String str2 = "";
               for(int j = 0; j < str.length(); j++) {
                   str2 += Integer.parseInt(str) % 2; 
               } 
            
               count++; // 3. 변환 1번 추가 
            }
            
            answer[0] = count;
            answer[1] = str2;
            
            return answer;
        }
    }

     

    📌 기존 코드의 문제점

     

    1. 문자열 조작이 비효율적

    • str += "1" 방식으로 문자열을 누적. 이는 반복적으로 새로운 문자열 객체를 생성하므로 비효율적.
    • 해결책: StringBuilder나 다른 메서드를 사용.

     

    2. 잘못된 조건 검사

    • if(s.charAt(i) == 1) 조건에서 1을 문자 '1'로 비교하지 않아 항상 실패.
    • 해결책: if(s.charAt(i) == '1')로 수정.

     

    3. 잘못된 2진 변환 로직

    • Integer.parseInt(str) % 2로 2진법 변환 시도. 그러나 Integer.toBinaryString() 메서드를 활용하는 것이 올바름.
    • 해결책: 숫자를 직접 변환하지 말고 Integer.toBinaryString(숫자) 사용.

     

    4. 무한 반복

    • 종료 조건이 없어 무한 루프 발생.
    • 해결책: while (!s.equals("1")) 조건 추가.

     

    5. 결과 값 오류

    • answer[1] = str2에서 str2는 변환 횟수가 아닌 문자열. 올바른 누적 계산값을 반환해야 함

     



    [ 정답 코드 & 올바른 풀이 ]

    📌 올바른 풀이

     

    1. 원래 수에서 0제거하기 방식 수정 

        replaceAll("0", ""); 을 사용해 문자열에서 모든 0을 제거 

     

    2. 2진법 변환 방식 수정

        Integer.toBinaryString(길이); 를 사용해 남은 문자열 길이를 2진법 문자열로 변환

     

    3. while문 수정 

        최종 이진 변환 결과는 항상 "1"인점을 이용해 while(!s.equals("1")) 으로 수정해 문자열 s가 "1"이 될 때까지 반복

     

    4. count 누적 방식 수정

        제거된 0의 개수와 변환 횟수를 각각 누적

     



    📌 정답 코드

    class Solution {
        public int[] solution(String s) {
            int[] answer = new int[2];
            int count = 0; 
            int removedZeros = 0; // 제거된 0의 개수 
            
            while(!s.equals("1")) { // s가 모두 "1"이 될때까지 반복 (최종 이진 변환 결과는 항상 "1"인점을 이용)
                
               // 1. 원래 수에서 0제거하기 
               int originalLength = s.length();
               s = s.replaceAll("0", ""); // 모든 0을 제거 // "1111"
               int newLength = s.length(); // 4
                
               removedZeros += (originalLength - newLength); 
    
               // 2. 2진법으로 변환하기  
                // 길이를 2진법 문자열로 변환 // 4 -> 110 
               s = Integer.toBinaryString(newLength);
            
               // 3. 변환 1번 추가 
               count++; 
            }
            
            answer[0] = count;
            answer[1] = removedZeros;
            
            return answer;
        }
    }
    반응형
Designed by Tistory.