programmers.co.kr/learn/courses/30/lessons/70129
[문제 설명]
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] |
[풀이]
문제 설명의 나온 조건 2가지를 사용하면 쉽게 해결할 수 있는 문제다.
1. 모든 0을 제거,
2. s의 길이를 2진법으로 표현
위 두 조건을 지키면서 문제를 풀고, 변환 횟수, 제거된 모든 0의 개수를 기록하면서 풀면 되는 문제이다.
아래는 주석과 함께 풀이한 문제다.
[코드]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
/**
* level 2
* 이진 변환 반복하기
* https://programmers.co.kr/learn/courses/30/lessons/70129
*/
public int[] solution(String s) {
int convertCount = 0;
int removeZero = 0;
//s의 길이가 1이 아니면서
while(!s.equals("1")) {
int zero = 0;
//0 개수 구하기.
for(int i = 0; i < s.length(); i++) {
if(s.charAt(i) == '0') zero++;
}
//0을 제거한 뒤, 해당 문자열의 길이를 이진수로 변환. ex 1111(4) -> 100
s = s.replaceAll("0", "");
s = Integer.toBinaryString(s.length());
convertCount++;
removeZero += zero;
}
//변환한 스텝과 제거된 0의 개수를 배열로 반환
return new int[] {convertCount, removeZero};
}
|
cs |
느낀 점: index0f를 통한 지정된 문자 개수를 찾는 방법도 있다.. 파이썬 같이 count함수가 있었으면 좋겠다.
반응형
'코딩테스트 > 프로그래머스 level 2' 카테고리의 다른 글
[프로그래머스 level_2 / 월간 코드 챌린지 시즌2] 괄호 회전하기 for JAVA (0) | 2021.05.09 |
---|---|
[프로그래머스 level_2] 프린터 for JAVA (0) | 2021.05.05 |
[프로그래머스 level_2 / 월간 코드 챌린지 시즌 1] 쿼드압축 후 개수 세기 for JAVA (0) | 2020.11.05 |
[프로그래머스 level_2] 소수 찾기 for JAVA (0) | 2020.09.26 |
[프로그래머스 level_2] 주식가격 for JAVA (0) | 2020.07.10 |