본문 바로가기
백준 Algorithm

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

by Echung 2023. 4. 6.

Problem

이진 변환 반복하기

 

Solution

 0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하는 문제이다.

1. s의 길이와 s에서 replaceAll() 을 사용하여 0을 제거한 후 길이를 구한다.

2. 그 과정을 count해주고, 그 과정에서 0이 제거된 길이도 zeroCount에 카운트해준다.

3. 0을 제거한 길이를 다시 Integer.toBinaryString()을 사용하여 이진법으로 만든다.

4. 위의 조건을 반복하여 s 가 "1"이 될 때까지 반복한다.

 

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[2];
        int count = 0;
        int zeroCount = 0;

        while(!s.equals("1")) {
            int length = s.length();
            int oneLength = s.replaceAll("0", "").length();
            int remain = length - oneLength;
            count++;
            zeroCount += remain;
            
            s = Integer.toBinaryString(oneLength);
        }
        
        answer[0] = count;
        answer[1] = zeroCount;

        return answer;
    }
}

사진 1. 실행 결과

 이렇게 코드가 잘 돌아가지면 replaceAll()을 사용해서 그런지 테스트 10, 11이 19.33ms, 27.00ms로 시간이 많이 걸리는 걸 확인할 수 있었다. 그래서 저것을 for문으로 대처해 보았다.

 

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[2];
        int count = 0;
        int zeroCount = 0;

        while(!s.equals("1")) {
            int length = s.length();
            int oneLength = 0;
	   int remain = 0;
	   for (int I =0 ; I < s.length(); I++) {
		if (s.charAt(i) == ‘1’) {
			oneLength++;
		} else {
			remain++;	
		}
	}

            count++;
            zeroCount += remain;
            
            s = Integer.toBinaryString(oneLength);
        }
        
        answer[0] = count;
        answer[1] = zeroCount;

        return answer;
    }
}

사진 2. 실행 결과

확실히 for 문을 사용하니 테스트 10, 11의 시간이 5.33ms, 5.12ms로 줄어든 것을 확인할 수 있었다.

 

마치며

 위의 방법들에서 큰 차이는 문자열 메소드를 사용하냐 안하냐의 차이인데 성능적에서는 큰 차이가 나는 것 같다. for문을 사용해서 코드량이 늘어나면 성능이 좋아지고 문자열 메소드를 사용하면 코드량은 줄어드는데 성능이 좀 나빠지는 것을 보면서 앞으로는 이런 것도 최적화하는 연습도 해봐야겠다.

반응형