✔ 이진 변환 반복하기
문제 분석하기
문자열에서 0을 제거한 후 x의 길이만큼에 대해 2진법으로 변환을 반복하여 1이 되도록 함
예) 1111111
0이 없으므로 7을 이진법 변환하여 111 : [1, 0]
0이 없으므로 3을 이진법 변환하여 11 : [2, 0]
0이 없으므로 2를 이진법 변환하여 10 : [3, 0]
0이 있으므로 0을 제거하고 1을 이진법 변환하여 1 : [4, 1]
손으로 풀어보기
- x에서 0을 제거하고 제거 하기 전의 길이와 제거한 후의 길이를 비교하여 제거한 0의 개수 증가
- x의 길이를 2진법으로 변환하고 2진법 변환 횟수 증가
- x가 1이 될 때까지 위를 반복
슈도코드 작성하기
s(0과 1로 이루어진 어떤 문자열)
answer(이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수)
while(s가 1이 될때까지) {
before(0을 제거하기 전의 s 길이)
s = s에서 0을 공백으로 변환
after(0을 제거한 후의 s 길이)
answer[1]을 before - answer만큼 증가
s의 길이만큼 이진법으로 변환한 값을 다시 s에 저장
answer[0] 증가
}
answer 반환
코드 구현하기
/**
* 70129) 이진_변환_반복하기
*/
public class L061_70129 {
// s(0과 1로 이루어진 어떤 문자열)
public int[] solution(String s) {
// answer(이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수)
int[] answer = new int[2];
// s가 1이 될때까지
while (!s.equals("1")) {
// before(0을 제거하기 전의 s 길이)
int before = s.length();
// s = s에서 0을 공백으로 변환
s = s.replaceAll("0", "");
// after(0을 제거한 후의 s 길이)
int after = s.length();
// answer[1]을 before - answer만큼 증가
answer[1] += before - after;
// s의 길이만큼 이진법으로 변환한 값을 다시 s에 저장
s = Integer.toBinaryString(s.length());
// answer[0] 증가
answer[0]++;
}
// answer 반환
return answer;
}
// 테스트 케이스
public static void main(String[] args) {
L061_70129 solution = new L061_70129();
String s = "110010101001";
int[] result = solution.solution(s);
System.out.println(Arrays.toString(result));
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[72412] 순위 검색 (0) | 2024.01.26 |
---|---|
[72411] 메뉴 리뉴얼 (0) | 2024.01.25 |
[68936] 쿼드압축 후 개수 세기 (0) | 2024.01.24 |
[68645] 삼각 달팽이 (0) | 2024.01.24 |
[67257] 수식 최대화 (0) | 2024.01.23 |