[ 문제 설명 ]
0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
1. x의 모든 0을 제거합니다.
2. x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
예를 들어, x = "0111010" 이라면,
x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.
0과 1로 이루어진 문자열 s가 매개변수로 주어집니다.
s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때,
이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를
각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.
[ 문제 풀이 ]
주어진 설명만 이해하면 풀이는 어렵지 않은 문제이다.
먼저, 입력으로 주어지는 s가 "1"이 될 때까지 반복문을 수행하도록 만든다.
0이라는 문자열만 제거하면 되는 단순한 조건이기에
replace 함수를 통해 0을 제거하고,
제거하기 전 문자열의 길이(before)와 제거한 후(after)의 길이를 각각 저장한다.
before - after는 제거된 0의 개수가 되며,
[문제 설명]의 정의 2번에 따라, after를 2진법으로 변환하여 다시 문자열 변수 s에 저장한다.
변환 횟수는 반복문을 수행할 때마다 1씩 증가하도록(tern++) 하고,
제거된 0의 개수는 반복문을 수행할 때마다 계속 누적(remove += (before-after))시켜 준다.
이와 같은 로직을 반복하며, 이진 변환의 횟수(tern)와 제거된 0의 개수(remove)를 구한다.
import java.util.*;
class Solution {
public int[] solution(String s) {
int[] answer = new int[2];
int tern = 0; // 변환 횟수
int remove = 0; // 제거된 0의 개수
while(!s.equals("1")) {
int before = s.length(); // 0을 제거하기 전 길이
s = s.replace("0", "");
int after = s.length(); // 0을 제거한 후 길이
s = Integer.toBinaryString(after);
tern++; // 변환 횟수 증가
remove += (before - after); // 제거된 0의 개수 증가
}
answer[0] = tern;
answer[1] = remove;
return answer;
}
}