문제 설명
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 함수를 완성해주세요.
제한사항
- s의 길이는 1 이상 150,000 이하입니다.
- s에는 '1'이 최소 하나 이상 포함되어 있습니다.
입출력 예
s | result |
"110010101001" | [3,8] |
"01110" | [3,3] |
"1111111" | [4,1] |
처음 생각한 풀이
function solution(s) {
let countWork = 0;
let countZero = 0;
let string = s;
function work(string){
let noZero = string.split('').filter(el => el !== '0').reduce((a,b)=>a+b)
countWork += 1
countZero += (string.length-noZero.length)
return noZero.length.toString(2)
}
while(string !== '1'){
string = work(string)
}
return [countWork, countZero]
}
s 에서 0을 제거하고 이진법으로 변환하는 기능을 함수로 분리해서 작성했다.
이후 while 반복문을 이용해 주어진 조건인 s가 '1' 이 될때 까지 반복했다.
정상적으로 잘 작동했지만, 다른 분의 풀이를 보고 코드를 최적화 하기로 했다.
참고한 코드
ㄹunction solution(s) {
var answer = [0,0];
while(s.length > 1) {
answer[0]++;
answer[1] += (s.match(/0/g)||[]).length;
s = s.replace(/0/g, '').length.toString(2);
}
return answer;
}
개선한 코드
function solution(s) {
let result =[0,0];
function work(string){
let noZero = string.split('').filter(el => el !== '0').reduce((a,b)=>a+b)
result[0] += 1
result[1] += (string.length-noZero.length)
return noZero.length.toString(2)
}
while(s !== '1'){
s = work(s)
}
return result
}
참고한 코드에서 변수 초기 선언을 number 2개를 하는 대신 배열 하나로 처리해 코드 가독성을 높히고 s를 받아주는 string을 선언하지 않는 방식으로 코드를 짜서 참고해서 풀었다. 결과적으로 코드가 깔끔해졌다.
하지만, 이후 깃허브에 올라간 계산 결과를 보니 개선한 코드의 속도가 더 느렸다. 배열로 변수 선언하는 것이 코드가 깔끔해지는 것 과는 별개로 처리가 늦었다.
'Algorithm > 푼 문제' 카테고리의 다른 글
프로그래머스/Lv0/외계어 사전(출제 오류?) (0) | 2023.04.01 |
---|---|
프로그레머스/Lv0/약수 구하기 (0) | 2023.03.31 |
프로그레머스/Lv0/가까운 수 (0) | 2023.03.30 |
프로그레머스/Lv0/직사각형 넓이 구하기 (1) | 2023.03.24 |
프로그레머스/Lv0/잘라서 배열로 저장하기(미완성) (0) | 2023.03.24 |