Problem
Solution
0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하는 문제이다.
1. s의 길이와 s에서 replaceAll() 을 사용하여 0을 제거한 후 길이를 구한다.
2. 그 과정을 count해주고, 그 과정에서 0이 제거된 길이도 zeroCount에 카운트해준다.
3. 0을 제거한 길이를 다시 Integer.toBinaryString()을 사용하여 이진법으로 만든다.
4. 위의 조건을 반복하여 s 가 "1"이 될 때까지 반복한다.
class Solution {
public int[] solution(String s) {
int[] answer = new int[2];
int count = 0;
int zeroCount = 0;
while(!s.equals("1")) {
int length = s.length();
int oneLength = s.replaceAll("0", "").length();
int remain = length - oneLength;
count++;
zeroCount += remain;
s = Integer.toBinaryString(oneLength);
}
answer[0] = count;
answer[1] = zeroCount;
return answer;
}
}
이렇게 코드가 잘 돌아가지면 replaceAll()을 사용해서 그런지 테스트 10, 11이 19.33ms, 27.00ms로 시간이 많이 걸리는 걸 확인할 수 있었다. 그래서 저것을 for문으로 대처해 보았다.
class Solution {
public int[] solution(String s) {
int[] answer = new int[2];
int count = 0;
int zeroCount = 0;
while(!s.equals("1")) {
int length = s.length();
int oneLength = 0;
int remain = 0;
for (int I =0 ; I < s.length(); I++) {
if (s.charAt(i) == ‘1’) {
oneLength++;
} else {
remain++;
}
}
count++;
zeroCount += remain;
s = Integer.toBinaryString(oneLength);
}
answer[0] = count;
answer[1] = zeroCount;
return answer;
}
}
확실히 for 문을 사용하니 테스트 10, 11의 시간이 5.33ms, 5.12ms로 줄어든 것을 확인할 수 있었다.
마치며
위의 방법들에서 큰 차이는 문자열 메소드를 사용하냐 안하냐의 차이인데 성능적에서는 큰 차이가 나는 것 같다. for문을 사용해서 코드량이 늘어나면 성능이 좋아지고 문자열 메소드를 사용하면 코드량은 줄어드는데 성능이 좀 나빠지는 것을 보면서 앞으로는 이런 것도 최적화하는 연습도 해봐야겠다.
반응형
'백준 Algorithm' 카테고리의 다른 글
[프로그래머스] 덧칠하기 (0) | 2023.04.13 |
---|---|
[프로그래머스] 숫자의 표현 (0) | 2023.04.07 |
[프로그래머스] 다음 큰 숫자 Java 풀이 (0) | 2023.04.05 |
[프로그래머스] 문자열 나누기 Java 풀이 (0) | 2023.03.15 |
[프로그래머스] 대충 만든 자판 Java 풀이 (2) | 2023.03.13 |