728x90
코딩테스트 연습 - 이진 변환 반복하기
programmers.co.kr
📝 문제 설명
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'이 최소 하나 이상 포함되어 있습니다.
🖨 입출력 예
s | result |
---|---|
"110010101001" | [3,8] |
"01110" | [3,3] |
"1111111" | [4,1] |
📂 분류
구현
💡 풀이
처음 문제를 읽었을 때는 이해가 잘 되지 않았는데, 입출력 예 설명을 보고 이해했다.
이 문제는 문자열의 모든 0을 제거한 길이의 이진법이 "1"이 될 때까지의 0의 개수와 변환 과정의 횟수를 구하는 문제이다.
설계
- 0을 제거한 길이를 구하기 위해 0의 개수를 구하고, s의 길이에서 빼준다.
- 0을 제거한 길이을 이진법을 변환한다.
s
가 "1"이 될 때까지 1, 2를 반복하면서 0의 개수와 반복한 횟수를 카운팅 한다.
💻 코드
class Solution {
private static int numberOfZeros = 0;
public static int[] solution(String s) {
int count = 0;
while (!s.equals("1")) {
count += 1;
int nextNumber = s.length() - getNumberOfZeros(s);
s = Integer.toBinaryString(nextNumber);
}
return new int[]{count, numberOfZeros};
}
private static int getNumberOfZeros(String s) {
int ret = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '0') {
ret += 1;
}
}
numberOfZeros += ret;
return ret;
}
}
728x90
'Algorithm > 프로그래머스' 카테고리의 다른 글
[Java] 프로그래머스 - 로또의 최고 순위와 최저 순위(Level 1) (0) | 2022.04.10 |
---|---|
[Java] 프로그래머스 - 점프와 순간 이동 (Level 2) (0) | 2022.04.09 |
[JAVA 풀이] 프로그래머스 - 캐시 (2018 KAKAO BLIND RECRUITMENT) (0) | 2022.04.07 |
[JAVA 풀이] 프로그래머스 - 모음사전 (Level 2) (0) | 2022.04.06 |
[JAVA 풀이] 프로그래머스 - 전력망을 둘로 나누기 (Level 2) (0) | 2022.04.01 |