728x90

 

문제설명

입력 & 출력

나의 풀이

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[2];
        String result = s;
        int count = 0;
        
        while(!result.equals("1")){
            int zero_count = 0;
            StringBuilder new_string = new StringBuilder();
            for(int i = 0 ; i < result.length(); i++){
                if(result.charAt(i) != '0'){
                    new_string.append(result.charAt(i));
                }
                else{//제거할 0의 개수
                    zero_count++;
                }
            }
                count++; //회차 증가
                int len = new_string.length();
                String binaryString = Integer.toBinaryString(len); // 2진수 변환
                
                answer[0] = count;
                answer[1] += zero_count;
                
                result = binaryString;
            
        }
        return answer;
    }
}

 

이번 문제는 0과 1로 이루어진 문자열을 1이 될 때까지 반복하는 횟수0을 삭제한 횟수를 구하는 문제입니다.

 

처음에 0을 제거한 뒤 1만 남은 문자열을 2진법으로 변환하는 것인 줄 알고 답과 달라서 이해가 좀 안 됐는데 쉽게 말하자면 주어진 문자열을 0을 제거하고 난 뒤 1만 남은 문자열의 길이를 새로운 문자열로 설정하고 문자열이 "1"이 될 때까지 반복하면 되는 문제입니다.

 

"01110"

  • 1) 문자 '0' 제거
    • "01110" ➡️ "111" 
  • 2) 길이로 변환 후 문자열 변환
    • "111" ➡️ "3"
  • 3) 다시 이진변환
    • "3" ➡️ "11"

위 작업을 계속해서 이어나가서 최종적으로 "1"이 됐을 때 반복 횟수0을 삭제한 횟수를 구하면 되는 문제입니다.

 

풀이를 설명하자면 각 횟수를 담아줄 answer 배열을 초기화해줍니다.

 

회차를 카운트할 count변수를 while문 밖에서 초기화하여 관리해 주고, 0을 삭제한 횟수 zero_count는 while문안에서 계속해서 업데이트해 줍니다.

 

"1"이 되기 전까지 계속해서 문자열을 업데이트해줘야 하기 때문에 while문의 조건을 equals() 메서드를 사용하여 "!"과 비교했을 때 같지 않다면 계속해서 반복해 줍니다.

 

속도를 빠르게 하기 위해 그냥 문자열 결합보다 StringBuilder를 사용하여 새로운 문자열을 저장합니다.

 

이제 본격적인 문자열 조작을 위해서 for문을 사용하여 문자열에 접근해 줍니다. 그리고 charAt() 메서드를 사용하여 각 문자요소가 '1'이라면 새로운 문자열에 append 해주고, 아니라면 삭제해야 할 '0'이기 때문에 zero_count를 증가시켜 줍니다.

 

위 작업까지 해주면 1) 단계를 마무리했습니다. 이제 2) 단계 작업에 대해서 설명을 하겠습니다.

 

문자열 조작이 끝나면 회차를 증가시켜 주고, 0을 제거한 문자열의 길이를 변수 len에 저장을 해줍니다.

 

그리고 마지막 3) 단계 작업을 위해서 Integer클래스toBinaryString() 메서드를 사용하여 길이를 2진법으로 변환한 문자열을 binaryString변수에 담아줍니다.

 

회차와 0을 제거한 횟수를 answer배열에 할당해 주고, result에 2진법으로 변환한 문자열을 담아줘서 result를 업데이트시켜 줍니다.

 

 

 

다른 풀이

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[2];
        
        while(!s.equals("1")){
            answer[1] += s.chars().filter(c -> c == '0').count();        
            s = Integer.toBinaryString(s.replaceAll("0", "").length());
            answer[0]++;

        }
        return answer;
    }
}

 

딱 보기에도 아주 간결한 코드입니다.

 

while문의 조건은 "나의 풀이"와 동일하지만, Stream APIchars() 메서드count() 메서드를 사용하여 간결하게 표현할 수 있습니다.

 

그리고 문자열 s를 업데이트하는 과정에서 replaceAll() 메서드를 사용하여 반복문과 조건문을 사용하지 않고 0을 제거하고, 길이를 구할 수 있습니다.

 


String str = "Hello";
// 문자열을 문자 스트림으로 변환한 후, 각 문자를 출력
str.chars().forEach(ch -> System.out.print(((char) ch) + " "));

//결과 : H e l l o

 

chars() 메서드는 해당 문자열 또는 문자 시퀀스를 순회할 수 있는 스트림을 반환합니다. 

즉 chars() 메서드를 사용하여 문자열문자 스트림으로 변환하고, 이를 사용하여 각 문자를 출력할 수 있습니다. 

 

 

 

참고 ❗

 

[JAVA] Stream API에 대해 알아보기 _ Stream 생성 (2/5)

Stream API를 사용하기 위해서는 먼저 Stream을 생성해주어야 합니다. 이번 포스팅에서는 Java 8에서 추가된 스트림(Stream) 사용법에 대해 알아보겠습니다. Stream생성하기 ❕Stream을 생성하기 위해서는

pixx.tistory.com

 

 

[Java] toBinaryString(), toHexString(), toOctalString() , parseInt() 알아보기 (n진법 변환)

Java를 다루거나, 코딩 테스트를 준비하다 보면 정수형 숫자를 n진수 문자열로 변환해야 하는 일이 종종 있습니다. Java에서는 toBinaryString(), toHexString(), toOctalString()이라는 정수를 n진수 문자열로

pixx.tistory.com