코딩테스트/프로그래머스 level 2

[프로그래머스 level_2/월간 코드 챌린지 시즌1] 이진 변환 반복하기 for JAVA

냠냠:) 2021. 3. 15. 22:55

programmers.co.kr/learn/courses/30/lessons/70129

 

코딩테스트 연습 - 이진 변환 반복하기

 

programmers.co.kr

[문제 설명]

0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.

  1. x의 모든 0을 제거합니다.
  2. 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함수가 있었으면 좋겠다.

반응형