공부, 알고리즘/프로그래머스

[프로그래머스/JAVA] Level 2. 이진 변환 반복하기

박주단 2021. 4. 10. 23:52

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]

# 입출력 예 설명

  • "110010101001"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.

# 풀이

class Solution {
  public int[] solution(String s) {
    int[] answer = new int[2];

    while(s.length() > 1) {

      int cntOne = 0;
      for(int i=0; i<s.length(); i++) {

        if(s.charAt(i) == '0') answer[1]++;
        else cntOne++;
      }

      s = Integer.toBinaryString(cntOne);
      answer[0]++;
    }

    return answer;
  }
}

 

 

#3

리턴할 answer 배열의 크기를 2로 선언합니다.

 

#5

while()을 활용해서 입력받은 문자열 s의 길이가 1이 될 때까지 반복합니다.

 

#7

1의 개수를 세어줄 int형 변수 cntOne을 선언합니다.

 

#8, 10

for()을 s의 길이만큼 돌립니다. 조건문을 활용해서 첫 번째 문자부터 0인지 확인합니다.

만약 0이면 answer[1]++를 하고 그렇지 않으면 cntOne++를 합니다. (이진수라서 0이 아니면 무조건 1이기 때문)

 

#14

위에서 계산해둔 1의 개수를 toBinaryString()를 사용해서 이진수로 변경하고 s에 넣어둡니다.

예시 1번에 따르면 1의 개수가 총 6개라서 cntOne이 6이 되어있고, 이를 이진수로 변경하면 110이 됩니다.

 

#15

이렇게 이진수로 변환할 때마다 answer[0]++를 합니다.

 

#18

이렇게 s가 1이 될 때까지 계속 반복하면 이진 변환 횟수와 제거한 0의 개수를 확인할 수 있고 이를 리턴합니다.