본문 바로가기
코딩테스트/Java

[Level2] 이진 변환 반복하기 답안 및 풀이

by SRin23 2021. 12. 29.

◇ 문제 설명

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]

 

◇ 초기 내용

※ [출처] 프로그래머스-코딩테스트 연습-문제명

※ 초기 내용을 참고하여 문제에 맞는 코드를 작성하세요.

class Solution
{
    public int solution(int [][]board)
    {
        int answer = 1234;

        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        System.out.println("Hello Java");

        return answer;
    }
}

 


◇ 풀이 과정

문제의 풀이과정은 이러했다.

  1. s문자열에서 1의 개수를 찾는다.
  2. 찾은 1의 개수를 2진수로 변환하여 s에 저장한다.
  3. s의 길이에서 1의 개수를 뺀값을 answer[1]에 누적하여 저장한다.
  4. 위 1~3을 반복하며 반복횟수를 answer[0]에 저장한다.

 

◇  참고 사항

첫번째, str.equals("문자열")

  • 문자열을 비교하는 함수이다.
  • 매개변수의 문자열이 str변수의 문자열과 같은지 각 요소를 비교한다.
  • String형을 ==연산자를 이용하여 비교할 경우 각 문자열의 문자를 비교하는 것이 아닌, 메모리 공간을 비교한다.
    class Solution {
        public int[] solution(String s) {
    		int[] answer = new int[2];
    		//이 경우, s와 문자열 "1"의 주소는 다르므로
            	//무한반복이 실행됨
    		while(s!="1") {
    			--생략--
    		}
    		return answer;
        }
    }

두번째, Integer.toBinaryString(n)

  • int형 n을 String형의 2진수로 변환하여 반환하는 메서드이다.

 

◇ 답안

더보기
더보기
class Solution {
    public int[] solution(String s) {
        //return값은 반복횟수, 0의 누적 개수를 배열로 만든 값이므로
		//총 2개의 인덱스를 가지는 배열을 선언한다.
		int[] answer = new int[2];
		
		//s가 1이 아니면 아래 코드 실행
		while(!s.equals("1")) {
			//1의 개수를 셀 cnt변수 생성
			int cnt = 0;
			
			//s의 길이만큼 반복
			for (int i = 0; i < s.length(); i++) {
				//만약, s의 요소가 1이라면 cnt 1증가
				if (s.charAt(i) == '1') {
					cnt++;
				}
			}
			//answer의 1번 인덱스에사는 0의 개수 누적합을 구하므로
			//s의 전체 길이에서 1의 개수를 뺸수, 즉 0의 개수를 answer[1]에 저장한다.
			answer[1] += (s.length()) - cnt;
            
			//answer[0]은 반복 횟수를 세므로, while문이 끝날때마다 1증가한다.
			answer[0]++;
            
			//s의 값을 cnt를 2진수로 변환한 문자열로 변경한다.
			s = Integer.toBinaryString(cnt);
		}
		
		return answer;
    }
}

 

◇ 실행결과

이진 변환 반복하기 실행결과

 

◇ 출처

https://programmers.co.kr/learn/challenges

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

댓글