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

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

GAEBAL 2022. 9. 19. 22:47
728x90

문제

https://school.programmers.co.kr/learn/courses/30/lessons/70129

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

풀이

쉬운 문제임

 

근데 보니까 전에도 풀었더라고 ㅎㅎ

 

문제 잘 읽고 그대로 풀면 됨

 

다 풀고 전에 풀었던 코드 보니까 

s = s.replace("0", "");

이렇게 문자열 함수 사용했던데 이렇게 하는게 시간도 더 빠르고 코드 길이도 짧을 듯함 !

 

자세한건 주석으로 !

 

 

코드

// 코딩테스트 연습 - 월간 코드 챌린지 시즌1 - 이진 변환 반복하기
// https://programmers.co.kr/learn/courses/30/lessons/70129

package PROGRAMMERS.level2;

import java.util.Arrays;

public class Num70129_이진변환반복하기2 {
    private static class Solution {
        private int[] solution(String s) {
            int transCount = 0; // 변환 횟수
            int totalZeroCount = 0; // 총 제거한 0 횟수

            while (!s.equals("1")) { // s가 1이면 변환 멈추기
                transCount++;
                int zeroCount = countZero(s);
                if (zeroCount == 0) { // zeroCount가 0이면
                    s = Integer.toBinaryString(s.length()); // s의 길이를 이진수로 변환
                } else { // 아니면
                    totalZeroCount += zeroCount;
                    s = Integer.toBinaryString(s.length() - zeroCount); // (s의 길이 - 0의 개수)를 변환 
                }
            }

            return new int[]{transCount, totalZeroCount};
        }

        // s에서 0의 개수 세기
        private static int countZero(String s) {
            int zeroCount = 0;
            for (int i = 0; i < s.length(); i++) {
                if (s.charAt(i) == '0') {
                    zeroCount++;
                }
            }
            return zeroCount;
        }

        public static void main(String[] args) {
            Solution sol = new Solution();

            System.out.println(Arrays.toString(sol.solution("110010101001")));
            System.out.println(Arrays.toString(sol.solution("01110")));
            System.out.println(Arrays.toString(sol.solution("1111111")));
        }
    }

}
728x90