-
[프로그래머스 70129] 이진 변환 반복하기 (java)알고리즘 문제 풀기 2021. 4. 29. 22:54
나의 코드
import java.util.StringTokenizer; class Solution { public int[] solution(String s) { int round = 0; int eraseZero = 0; int c = 0; // 문자열 길이 while(!s.equals("1")) { round++; // 이진변환 1회 시작 c = 0; StringTokenizer st0 = new StringTokenizer(s, "1"); // 토큰 분리를 통해 1 제거 StringTokenizer st1 = new StringTokenizer(s, "0"); // 토큰 분리를 통해 0 제거 // 오차가 있지만 후처리할 예정 // 1을 제외한 문자열 생성 while(st0.hasMoreTokens()) { eraseZero += st0.nextToken().length(); // 남은 0의 갯수만큼 지워지니까 더해줌 } // 0을 제외한 문자열 생성성 while(st1.hasMoreTokens()) { String temp = st1.nextToken(); c += temp.length(); } s = Integer.toBinaryString(c); } return new int[] {round, eraseZero}; } }
일일히 한글자씩 비교하며 체크하는 방법 말고, 다른 방법을 사용해보고 싶었다. 다소 느릴 수도 있겠지만,
StringTokenizer()
를 이용하여 작업했다. 처음에는 0을 통한 토큰 분리 1개로 처리하려 했으나, 하나로는 0이 여러개 올 때에 대한 계산을 할 수가 없었다. 그래서 부득이 하게 1을 통한 토큰 분리, 0을 통한 토큰 분리 2개로 사용하여 처리했다. 불필요하게 string이 많이 만들어지니, 스스로 생각해도 비효율적이란 생각이 들었다.모범 답안
class Solution { public static int count; public static int zeroCount; public int[] solution(String s) { int[] answer = new int[2]; count =0; zeroCount=0; recursive(s); answer[0] = count; answer[1] = zeroCount; return answer; } public static void recursive(String s){ if(s.equals("1")) return; count++; StringBuilder sb = new StringBuilder(); for(char c : s.toCharArray()){ if(c=='0'){ zeroCount++; continue; } sb.append(c); } recursive(Integer.toBinaryString(sb.length())); } }
특별이 눈에 들어오는 코드는 없었다. 생각했던 것 처럼일일히 새는 방법이 제일 유효했다.
'알고리즘 문제 풀기' 카테고리의 다른 글
[프로그래머스 12981] 영어 끝말잇기 (java) (0) 2021.05.05 [프로그래머스 42746] 가장 큰 수 (java) (0) 2021.04.30 [프로그래머스 12924] 숫자의 표현 (java) (0) 2021.04.26 [프로그래머스 72410] 신규 아이디 추천 (java) (0) 2021.04.22 [프로그래머스 1845] 폰켓몬 (java) (0) 2021.04.22