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 함수를 완성해주세요.
제한사항
- s의 길이는 1 이상 150,000 이하입니다.
- s에는 '1'이 최소 하나 이상 포함되어 있습니다.
입출력 예
주어진 데이터 | 결과 | 설명 |
"110010101001" | [3,8] | 3번 반복하였고 0은 8개 제거 되었습니다. |
"01110" | [3,3] | 3번 반복하였고 0은 3개 제거 되었습니다. |
"1111111" | [4,1] | 4번 반복하였고 0은 1개 제거 되었습니다. |
문제 난이도가 레벨2라고 했지만 체감상 1정도 되는 거 같습니다..^^;
문제에 접근하기 위한 단계 입니다.
1번. 주어진 값에서 0을 제거 합니다.
2번. 제거한 데이터에서 길이를 구합니다.
3번. 구한 길이를 다시 2진법으로 변경하여 바꾸어 단계를 반복 합니다.
4번. 값이 1이면 그만하도록 합니다.
주어진 값에서 0을제거하기 위해서 문자열 값을 char 배열로 변환한 뒤에 0인 값과 1인 값을 구분하였습니다.
구분한 값 에서 1인 값만 다시 문자로 만들어 준 다음에 길이를 구하여 주었습니다.
1번과 2번에 대한 코드 입니다.
public static int[] solution(String s) {
int[] answer = {0, 0};
StringBuffer buff = new StringBuffer();
char[] array = s.toCharArray();
for(char a : array) {
if(a != '0') buff.append(a); //0이 아니면 더해 줍니다.
}
int length = buff.toString().length(); //구한 길이 값 입니다.
return answer;
}
구한 길이를 다시 이진법으로 변환하여 새로운 문자를 생성하여 줍니다.
3번에 해당하는 내용을 추가하여 보았습니다.
public static int[] solution(String s) {
int[] answer = {0, 0};
StringBuffer buff = new StringBuffer();
char[] array = s.toCharArray();
for(char a : array) {
if(a != '0') buff.append(a); //0이 아니면 더해 줍니다.
}
int length = buff.toString().length(); //구한 길이 값 입니다.
s = Integer.toBinaryString(length); // 길이를 다시 이진법으로 바꿔 줍니다.
return answer;
}
이제 남은것은 위 단계를 반복하면서 반복문이 동작한 횟수와 0을 바꾼 횟수를 구하는 것 입니다.
여기서 고민해야 되는 것은 "s의 길이는 1 이상 150,000 이하입니다." 라는 조건 입니다.
그렇기 때문에 StringBuffer 값을 비울 때 길이만큼 비우는 방식을 적용하여 주었습니다.
public static int[] solution(String s) {
int[] answer = {0, 0};
StringBuffer buff = new StringBuffer();
while(!s.equals("1")) {
char[] array = s.toCharArray();
for(char a : array) {
if(a != '0') {
buff.append(a);
} else {
answer[1]++; //0값 이므로 0을 바꾼 횟수를 증가시킵니다.
}
}
answer[0]++; //반복문이 동작한 횟수를 증가시킵니다.
s = Integer.toBinaryString(buff.toString().length());
buff.delete(0, buff.length()); //바꾼 문자를 보관하는 스트링버퍼를 비워줍니다.
}
return answer;
}
이제 남은것은 제출하기!
그렇게 어렵지 않은 문제여서 푸는데 오래걸리지 않았던 것 같습니다.
이진법에 대한 작업을 많이하지 않아서 Integer 클래스에서 toBinaryString 메소드 호출하는 방법은 검색하여 적용하였..ㅠ
이상으로 이진 변환 반복하기 (프로그래머스, Level 2)에 대해서 살펴보았습니다.
궁금한점 또는 틀린 부분은 언제든 연락주세요!👻
'Java(자바) > 코딩 테스트 & 알고리즘' 카테고리의 다른 글
BFS(Breadth-first Search), DFS(Depth-First Search) 너비우선 탐색, 깊이탐색 (0) | 2022.06.08 |
---|---|
전력망을 둘로 나누기 (프로그래머스, Level 2) (0) | 2022.06.07 |
영어 끝말잇기 (프로그래머스, Level 2) (0) | 2022.05.16 |
Java Map에서 Map데이터 다루기(자바 Map을 깊이탐색으로) (0) | 2021.06.23 |
10. 이중 우선순위 큐 (프로그래머스, 힙 Level 3) (0) | 2021.03.11 |
댓글