본문 바로가기

알고리즘/프로그래머스

[월간 코드 챌린지 시즌1] 이진 변환 반복하기

 

[ 문제 설명 ]

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"이 될 때까지 반복문을 수행하도록 만든다.

 

0이라는 문자열만 제거하면 되는 단순한 조건이기에

replace 함수를 통해 0을 제거하고,

제거하기 전 문자열의 길이(before)와 제거한 후(after)의 길이를 각각 저장한다.

 

before - after는 제거된 0의 개수가 되며,

[문제 설명]의 정의 2번에 따라, after를 2진법으로 변환하여 다시 문자열 변수 s에 저장한다.

 

변환 횟수는 반복문을 수행할 때마다 1씩 증가하도록(tern++) 하고,

제거된 0의 개수는 반복문을 수행할 때마다 계속 누적(remove += (before-after))시켜 준다.

 

이와 같은 로직을 반복하며, 이진 변환의 횟수(tern)와 제거된 0의 개수(remove)를 구한다.

 

import java.util.*;

class Solution {
    public int[] solution(String s) {
        int[] answer = new int[2];
        
        int tern = 0; // 변환 횟수
        int remove = 0; // 제거된 0의 개수
        
        while(!s.equals("1")) {
            int before = s.length(); // 0을 제거하기 전 길이
            s = s.replace("0", "");
            int after = s.length(); // 0을 제거한 후 길이
            s = Integer.toBinaryString(after);
            
            tern++; // 변환 횟수 증가
            remove += (before - after); // 제거된 0의 개수 증가
        }
        
        answer[0] = tern;
        answer[1] = remove;
        return answer;
    }
}