[프로그래머스 Lv2.] 이진 변환 반복하기 | Java

바다·2024년 5월 22일
0

코딩테스트

목록 보기
3/10
post-thumbnail

문제 설명

문제 바로가기 클릭! 🖱️

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'이 최소 하나 이상 포함되어 있습니다.

입출력 예시

sresult
"110010101001"[3,8]
"01110"[3,3]
"1111111"[4,1]

풀이과정

문제를 풀면서 방심했던 부분은 문제 설명에 2번에 있었던, x길이를 2진법으로 표현한 문자열로 표현한 문자열로 바꿔야 했다는 부분이다.

나는 문제를 제대로 보지 못하고, x의 모든 0을 제거한 문자열 자체에서 2진 변환을 시도해서... 숫자가 굉장히 길어지면서 꽤나 수고를 했다.

문제 자체는 간단해 보이지만, 10진수를 2진수로 변환하는 방식을 알지 못하면 검색이 필요했을 것 같다!

1) 10진수를 n진수로 변환하기

int number = 100;

//10진수 -> 2진수
String binary = Integer.toBinaryString(number);

//10진수 -> 8진수
String octal = Integer.toOctalString(number);

//10진수 ->  16진수
String hexaDemical = Integer.toHexString(number)';

2) n진수를 10진수로 변환하기

parseInt(String s, int radix)을 이용하기
문자열(s)을 변환할 진수(radix)로 읽어서 int로 반환한다

//2진수 -> 10진수
int binary = Integer.parseInt("1010",2);

//8진수 -> 10진수
int octal = Integer.parseInt("12", 8);

//16진수 -> 10진수
int hexaDemical = Integer.parseInt("A", 16);

전체 코드

class Solution {
    public int[] solution(String s) {
        int[] answer = {0, 0};			//정답 배열 선언
        
        while (!s.equals("1")) {				
            int before = s.length();	//0을 제거하기 전 길이
            s = s.replaceAll("0", "");	//0 제거
            int after = s.length();		//0을 제거한 후 길이
       
            answer[1] += before - after;		//제거한 0의 개수 저장
    
            s = Integer.toBinaryString(after);	//2진 변환
            
            answer[0]++;	//2진 변환한 횟수 증가
        }
        
        return answer;
    }
}

성능 요약

메모리 : 83.7 MB
시간 : 27.77 ms

최근 레벨 2 문제들을 풀기 시작했는데, 기본이 탄탄하지 않으면 푸는 데 쉽지 않은 것 같다! 문제를 풀면서 기본을 다지는 시간을 가져야겠다 🫡

profile
ᴘʜɪʟɪᴘᴘɪᴀɴs 3:14

0개의 댓글