Algorithm/Java

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

dbfl9911 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;
    }
}
반응형