-
[프로그래머스/JAVA] 이진 변환 반복하기Algorithm/Java 2024. 10. 30. 15:32
https://school.programmers.co.kr/learn/courses/30/lessons/70129?language=java
📌 문제 요약
0과 1로 이루어진 문자열 s를 변환하여 s가 "1"이 될 때까지 다음 과정을 반복:
- 문자열에서 모든 0 제거
- 제거 후 문자열의 길이를 2진법으로 변환
최종적으로 변환 횟수와 제거된 0의 개수를 반환하는 문제.
[ 오답 노트 ]
❌ 기존 오답 코드class Solution { public int[] solution(String s) { int[] answer = new int[2]; int count = 0; while(true) { // s가 모두 1이 될때까지 반복(0이 없어질때까지) String str = ""; // 1. 원래 수에서 0제거하기 for(int i = 0; i < s.length(); i++) { if(s.charAt(i) == 1) { str += "1"; } } // 1111 나옴 // 2. 2진법으로 변환하기 String str2 = ""; for(int j = 0; j < str.length(); j++) { str2 += Integer.parseInt(str) % 2; } count++; // 3. 변환 1번 추가 } answer[0] = count; answer[1] = str2; return answer; } }
📌 기존 코드의 문제점
1. 문자열 조작이 비효율적
- str += "1" 방식으로 문자열을 누적. 이는 반복적으로 새로운 문자열 객체를 생성하므로 비효율적.
- 해결책: StringBuilder나 다른 메서드를 사용.
2. 잘못된 조건 검사
- if(s.charAt(i) == 1) 조건에서 1을 문자 '1'로 비교하지 않아 항상 실패.
- 해결책: if(s.charAt(i) == '1')로 수정.
3. 잘못된 2진 변환 로직
- Integer.parseInt(str) % 2로 2진법 변환 시도. 그러나 Integer.toBinaryString() 메서드를 활용하는 것이 올바름.
- 해결책: 숫자를 직접 변환하지 말고 Integer.toBinaryString(숫자) 사용.
4. 무한 반복
- 종료 조건이 없어 무한 루프 발생.
- 해결책: while (!s.equals("1")) 조건 추가.
5. 결과 값 오류
- answer[1] = str2에서 str2는 변환 횟수가 아닌 문자열. 올바른 누적 계산값을 반환해야 함
[ 정답 코드 & 올바른 풀이 ]
📌 올바른 풀이1. 원래 수에서 0제거하기 방식 수정
replaceAll("0", ""); 을 사용해 문자열에서 모든 0을 제거
2. 2진법 변환 방식 수정
Integer.toBinaryString(길이); 를 사용해 남은 문자열 길이를 2진법 문자열로 변환
3. while문 수정
최종 이진 변환 결과는 항상 "1"인점을 이용해 while(!s.equals("1")) 으로 수정해 문자열 s가 "1"이 될 때까지 반복
4. count 누적 방식 수정
제거된 0의 개수와 변환 횟수를 각각 누적
📌 정답 코드class Solution { public int[] solution(String s) { int[] answer = new int[2]; int count = 0; int removedZeros = 0; // 제거된 0의 개수 while(!s.equals("1")) { // s가 모두 "1"이 될때까지 반복 (최종 이진 변환 결과는 항상 "1"인점을 이용) // 1. 원래 수에서 0제거하기 int originalLength = s.length(); s = s.replaceAll("0", ""); // 모든 0을 제거 // "1111" int newLength = s.length(); // 4 removedZeros += (originalLength - newLength); // 2. 2진법으로 변환하기 // 길이를 2진법 문자열로 변환 // 4 -> 110 s = Integer.toBinaryString(newLength); // 3. 변환 1번 추가 count++; } answer[0] = count; answer[1] = removedZeros; return answer; } }
반응형'Algorithm > Java' 카테고리의 다른 글
[프로그래머스/JAVA] 점프와 순간 이동 (0) 2024.10.31 [프로그래머스/JAVA] 피보나치 수 (0) 2024.10.30 [프로그래머스/JAVA] 콜라 문제 (0) 2024.10.30 [프로그래머스/JAVA] 문자열 내 마음대로 정렬하기 (0) 2024.10.29 [프로그래머스/JAVA] 2021 카카오 채용연계형 인턴십 문제 / 숫자 문자열과 영단어 (0) 2024.10.29