
문제설명
0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.x의 모든 0을 제거합니다.
x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면
x = "0111010" -> "1111" -> "100" 이 됩니다.0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서
s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를
각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.
public static void main(String[] args) {
String s = "110010101001";
int[] answer = {};
answer = convertLoopBinary(s);
System.out.println("결과: " + answer[0] + ", " + answer[1]);
}
문제를 보고 그냥 int형으로 바꾼뒤 0의 갯수를 누적하고 저 값 자체를 이진 변환하여 반복하는
문제로 생각했다. (문제를 또 잘못 생각한것이다.)
"x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다."
이렇게 나와 있는데도 잘못생각했다. 문제를 잘 읽고 유형에 익숙해져야겠다..
어쨋든 간에 잘못생각해서 꽤 많이 삽질을 했다.. 결국 문제 풀이를 보고나서 깨달았다..
그래도 쉬운문제였는데 말이지..
public static int[] convertLoopBinary(String s) {
int[] result = new int[2];
while(!s.equals("1")) { // 1이 될때까지 반복해야 하기 때문에 1이 아닌 경우 반복
int originLen = s.length(); // 문자열의 길이를 알아야 없앤 0의 갯수를 기록할 수 있다.
s = s.replaceAll("0", ""); // 여기서 0을 다 없애버리기 때문에... (0이 없어진 1111 형태로 바뀔거다.)
result[0]++; // 여긴 문자열이 1이 될때까지 반복된 횟수
result[1] += (originLen - s.length()); // 여긴 0을 없앤 횟수를 누적하여 기록
s = Integer.toBinaryString(s.length()); // Integer.toBinaryString을 쓰면 10진수 -> 2진수로 변환이 쉽다.
}
return result;
}
위와 같이 해결이 되었다.
중요한 포인트로 꼽자면 int, long 타입은 2진수를 곧바로 표현할 수 없다.
("0b"를 앞에붙이면 되긴하더라)
그래서 그냥 문자열에서 replaceAll 함수로 0을 전부 없애버리고 원래 문자열 길이에
replace된 문자열 길이를 빼면 그만큼 0이 삭제된거다. 그걸 누적하기만 하면 된다.
반복횟수는 루프 한번에 1씩 증가 하기만 하면 되었고, replace된 length를 그냥 2진수로 변환해주고
다시 반복하면 끝나는 문제였던 것이었다...! (문제를 잘 보자 제발..)