문제
0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
- x의 모든 0을 제거합니다.
- x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.
0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.
- 출력 예시 -
정답 코드
< 내 정답 코드 1 >
class Solution {
static int zeros = 0;
static int count = 0;
public int[] solution(String s) {
makeBinaryNum(s);
int[] answer = {count, zeros};
return answer;
}
public static String makeBinaryNum(String s) {
count++;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '0') {
zeros++;
}
}
s = s.replace("0", "");
int length = s.length();
s = Integer.toBinaryString(length);
if (s.equals("1")) {
return s;
}
return makeBinaryNum(s);
}
}
< 내 정답 코드 2 >
class Solution {
public int[] solution(String s) {
int zeros = 0;
int count = 0;
while (!s.equals("1")) {
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '0') {
zeros++;
}
}
s = s.replace("0", "");
s = Integer.toBinaryString(s.length());
count++;
}
int[] answer = {count, zeros};
return answer;
}
}
< 타인 답변 코드 >
class Solution {
public int[] solution(String s) {
int[] answer = new int[2];
int temp;
while (!s.equals("1")) {
answer[1] += s.length();
s = s.replaceAll("0", "");
temp = s.length();
s = Integer.toBinaryString(temp);
//System.out.println("s : " + s );
answer[0]++;
answer[1] -= temp;
}
return answer;
}
}
이것을 주의하자!
- 나는 두 가지 방식으로 풀었다.
(1) static 변수 + 재귀함수
: 동일한 작업을 반복해서 진행하기 위해 재귀함수를 만들었고, 몇 개의 0 을 삭제했는지, 몇 번 반복했는지를
파악하기 위해서 static 변수로 만들었다.
(2) while 문
: while 문을 사용해서 원하는 조건까지 무한 반복하도록 만들었다. 사실 처음에는 재귀함수만 떠올랐는데
생각해보니 while 문으로도 구현이 가능한 것 같아서 성공적으로 만들었다.
- 들어온 String 변수에서 0 이 몇 개인지 센 다음, replace( ) 메서드를 통해 0 을 일괄적으로 없앴다. 그리고 만들어진 문자열의 길이를 구해 Integer.toBinaryString( ) 를 사용하여 이진수로 바꿨다. 동일하게 s 변수에 저장해서 "1" 이 될때까지 반복했다.
- 타인 답변 코드에서는 0 을 삭제하는 로직이 나와 다르다. 나는 for 문을 이용해서 하나씩 탐색했다면, 해당 코드에선 먼저 모든 자리수를 구한 후 0 을 삭제한 뒤의 남은 수를 빼서, 총 삭제된 0 의 개수를 구했다. 이 방법이 더 효율적인 것 같다.
'코딩 테스트' 카테고리의 다른 글
[프로그래머스] (Lv.2) 최솟값 만들기 (0) | 2022.09.10 |
---|---|
[프로그래머스] (Lv.1) 폰켓몬 (0) | 2022.09.10 |
[프로그래머스] (Lv.2) JadenCase 문자열 만들기 *** (0) | 2022.09.09 |
[프로그래머스] (Lv.2) 최댓값과 최솟값 (0) | 2022.09.08 |
[프로그래머스] (Lv.1) 숫자 문자열과 영단어 *** (0) | 2022.09.08 |