*모든 풀이 코드는 직접 작성하였습니다.
문제
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'이 최소 하나 이상 포함되어 있습니다.
문제 풀이
이진수 때문에 조금 어려워 보이지만, 차근차근 하면 별로 어렵지 않은 문제다.
이 문제를 해결하는 순서는,
- 모든 1을 없앤 뒤 s의 길이를 알아낸다.
- 길이를 이진수로 바꾼다.
- s에 "1" 하나만 남을 때까지 1, 2를 반복한다.
1번은, 1을 없애기보다는 0의 갯수를 세었다. 문제에서 요구하는 것 중에 하나가 제거된 모든 0의 개수이기 때문이다. s의 길이는 [원래 s의 길이 - 0의 개수] 로 구한다.
2번은, 1번에서 구한 s의 길이를 toBinaryString() 메소드로 int타입인 s의 길이를 String 타입의 이진수로 변환한다. 매우 편한 메소드다.
이걸 계속 반복해서 s가 "1"일때 while문을 종료하고, 이진 변환의 횟수(changeCount)와 제거한 0의 개수(zeroCount)를 배열에 담아 반환한다.
풀이 코드
class Solution {
public int[] solution(String s) {
int sLength = 0;
int zeroCount = 0;
int changeCount = 0;
while(!s.equals("1")){
//s의 0의 갯수를 세는 count는 매번 초기화가 필요하다. s값이 계속 바뀌므로!
int count = 0;
//0 개수를 세는 for문
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) == '0') count++;
}
//s에서 1의 개수 저장
sLength = s.length() - count;
//zeroCount에 0 제거 횟수 합산
zeroCount += count;
//이진 변환 횟수 1 추가
changeCount++;
//s의 길이를 이진수로 변경
s = Integer.toBinaryString(sLength);
}
return new int[] {changeCount, zeroCount};
}
}
'Coding Test' 카테고리의 다른 글
Programmers - 다음 큰 숫자 (Java) (Lv.2) (0) | 2023.12.19 |
---|---|
Programmers - 숫자의 표현 (Java) (Lv.2) (0) | 2023.12.19 |
Programmers - 최솟값 만들기 (Java) (Lv.2) (0) | 2023.12.19 |
Programmers - 올바른 괄호 (Java) (Lv.2) (0) | 2023.12.19 |
Programmers - JadenCase 문자열 만들기 (Java) (Lv.2) (0) | 2023.12.19 |