본문 바로가기
Java/알고리즘

이진 변환 반복하기

by 티코딩 2024. 2. 20.

처음엔

1) binary 메서드로, 주어진 s에 0을 빼고, 남은 1의 개수를 이진법으로 반환하고, 뺀 0의 개수를 반환하는 메서드인 binary()를 만들고

2) solution메서드에서 s가 1이될때가지 binary메서드를 반복하고 binary 메서드를 몇번 호출했는지와, 총 뺀 0의 개수를 return하면되겠거니 해서 이렇게 풀었다.

 

ㅇ 오늘의 풀이(오답)

class Solution {
    public int[] solution(String s) {
        int zeroCnt = 0; // 누적된 0의 개수를 저장할 변수
        int biCnt = 0; //binary 메서드를 몇번반복했는가를 저장할 변수
        while (!s.equals("1")) { // 문자열이 "1"이 될 때까지 반복
            int[] result = binary(s); // binary 메서드 호출
            s = String.valueOf(result[0]); // 새로운 문자열로 갱신
            zeroCnt += Integer.parseInt(String.valueOf(result[1])); // 누적된 0의 개수 갱신
            biCnt++; // 반복 횟수 증가
        }

        return new int[]{biCnt, zeroCnt};
    }
    public static int[] binary(String a) {
        int cnt = 0;
        String answer = "";
        for(int i = 0; i < a.length(); i++){
            if(a.charAt(i) == '0'){
                cnt++;
            }
            else{
                answer += a.charAt(i);
            }
        }
        int[] result = new int[2];
        result[0] = Integer.parseInt(Integer.toBinaryString(answer.length())); // 0을 제외한 나머지 문자열을 이진수로 변환하여 저장
        result[1] = cnt; // 0의 개수 저장
        return result;
    }
}

이렇게 했더니, 정답은 나오지만, 몇개의 테스트케이스에서 런타임에러가 떴다. 내 예상이지만 메서드로 따로 만들고 형변환이 너무 잦다는 점에서 런타임 에러가 뜬거 같다.

하나의 메서드에서 풀었던 과거의 풀이를 다시 보자.

 

ㅇ 과거풀이(정답)

public int[] solution(String s) {
    int[] answer = {}; //정답을 담을 배열 초기화
    int transCount = 0; // 0빼고 남은1의개수만큼을 2진법한 횟수
    int zeroCount = 0; // 과정중 뺀 0의 총 갯수
        while(true){
            if(s.equals("1")) break; // s가 1이되면, 반복 그만
            zeroCount += s.length()-s.replace("0","").length(); //0의갯수를 구한다.
            s = s.replace("0",""); //s에서 0을 빼준다.
            s = Integer.toBinaryString(s.length()); //0을뺀 s의길이를 2진법으로 바꾼다.
            transCount++;
         }
     return new int[] {transCount,zeroCount};
    }

이번에 내가 푼 코드보다 반이상 짧다. 하지만 성능은 훨씬 좋다.

어떻게 풀었는지 보자.

진짜 왜 이렇게 진작 못풀었을까? 정말 한심하다. 알고리즘을 너무 쉬운것만 풀었더니 지능이 떨어졌다. 내일 다시 풀어봐야겠다.

'Java > 알고리즘' 카테고리의 다른 글

롤케이크 자르기  (0) 2024.04.11
방문길이  (1) 2024.03.22
올바른괄호  (0) 2024.02.14
최솟값만들기  (0) 2024.02.13
JadenCase 문자열  (1) 2024.02.08