Algorithm/Java
[프로그래머스/JAVA] 이진 변환 반복하기
dbfl9911
2024. 10. 30. 15:32
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/70129?language=java
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📌 문제 요약
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;
}
}
반응형