코딩테스트
프로그래머스(JAVA) - level2(이진 변환 반복하기)
yeosang0508
2025. 1. 21. 23:25
문제정리
0과 1로만 이루어진 문자열 s
s의 모든 0을 제거, s의 길이를 2진법으로 표현한 문자열
이진변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 배열에 담아 return
처음 작성한 코드
class Solution {
public int[] solution(String s) {
int[] answer = {};
String[] re = s.split("");
int count = 0; // 이진 변환의 횟수
int remove = 0; // 제거된 모든 0의 개수
String result = ""; // 이진 변환 결과
while(!result.equals("1")){
int length = 0; // 0 제거 후 길이
for(int i = 0; i <= re.length; i++){
int a = Integer.parseInt(re[i]);
if (a == 1){
result = a + "";
length++;
}else {
remove++;
}
}
// 0 제거 후 길이를 이진 변환
for(int j = 1; j <= length; j++){
}
}
return answer;
}
}
위 코드를 보면 이진 변환하려는 코드를 직접 계산하려고 for문 써서 생각하고 있는데.. 아무리 생각해도 어떻게 만들어도 노가다로 코드가 엄청 길어질거 같은데.. 그리고 어떻게 해야하지도 생각이 너무 안나서.. 결국 인터넷 검색해봤다..
검색해보니 역시 이진변환 해주는 코드가 따로 있었구나 그럴줄알았어!!!😓
자바에서 2진수, 10진수, 16진수 간 변환
- Integer.parseInt(String s, int radix) : 문자열을 특정 진수에서 10진수로 변환
- Integer.toBinaryString(int i) : 10진수를 2진수 문자열로 변환
- Integer.toHexString(int i) : 10진수를 16진수 문자열로 변환
최종 코드
class Solution {
public int[] solution(String s) {
int count = 0; // 이진 변환의 횟수
int remove = 0; // 제거된 모든 0의 개수
String result = s; // 이진 변환 결과
while(!result.equals("1")){
String[] re = result.split("");
int length = 0; // 0 제거 후 길이
for(int i = 0; i < re.length; i++){
int a = Integer.parseInt(re[i]);
if (a == 1){
result = a + "";
length++;
}else {
remove++;
}
}
// 0 제거 후 길이를 이진 변환
result = Integer.toBinaryString(length);
count++;
}
int[] answer = {count, remove};
return answer;
}
}
위 코드처럼 마무리는 지었지만.. 코드 길이가 너무 길고, 사실 좀 더 간결하게 적을 수 있는 방법이 있을텐데 현재로서는 최선..이였다... 다른 사람 코드 도 참고 해봐야할 것 같다.
시간은
ㅎㅎㅎㅎ.. 이진법에서 막힘..
다른 사람들의 코드
보통 배열을 사용하지 않고, replaceAll 사용해서 0을 제거 한 후 toBinaryString 이용해서 2진 변환하는 방식으로 해서 코드가 간결 했다..
매번 문제를 풀때 배열을 먼저 적용해서 접근하는 방식에 너무 익숙해져버린건 아닐까 생각을 하면서 풀어야겠다..
그래도 이번에는 계속 for문에서 갇혀서 풀었었는데 이 전 문제에서 while문 필요성을 느껴서 바로 적용했는데.. 이진변환만 아니였으면 좀 더 빠르게 풀 수 있었을텐데!
아쉽다 그래도 이번 문제를 통해서 toBinaryString 알 수 있었음!