이진 변환 반복하기
https://school.programmers.co.kr/learn/courses/30/lessons/70129?language=javascript
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
메모리: 36.6 MB, 시간: 13.11 ms
먼저 필요한 값을 변수로 뽑는다.
1이 될때까지 반복 < 이라는 말을 보고 while 문을 1이 아닐때만 실행하는 조건으로 짰다.
0의 개수는 문자열을 '0' 기준으로 나눈 뒤 공백의 개수를 세어 계산했고
이진 변환 횟수는 변환이 한 번 일어날 때마다 1씩 증가시켰다.
function solution(s) {
//이진 변환 횟수와 변환 과정에서 제거된 0를 배열에 담아라...
let num = s;
let count = 0; // 이진 변환 횟수
let removedZero = 0; // 제거한 0의 총 개수
while (num !== "1") {
//1이 될때까지 계속 반복
removedZero += num.split("0").length - 1;
// 0 제거 후 길이 확인
const newLength = num.replace(/0/g, "").length;
// 길이를 이진수로 변환
num = newLength.toString(2);
count++;
}
return [count, removedZero];
}
다른 풀이
메모리: 38.3 MB, 시간: 9.30 ms
split("0").length - 1 → 0의 개수를 구하기 위해 전체 배열을 생성
replace(/0/g, "") → 문자열 새로 만듦
이 두 가지 문제를 개선해 시간을 단축시켰다.
while (num !== "1") {
let ones = 0;
for (let char of num) {
if (char === "1") ones++; //문자열에서 1 개수 파악
}
removedZero += num.length - ones; //전체-1개수 = 0개수
num = ones.toString(2); //1의 길이만큼 이진법
count++;
}
문자열을 순회해서 1의 개수를 카운트 하고 전체 길이에서 빼줘서 0의 수를 구한다.
그리고 1의 개수를 계산해서 다시 이진법으로 돌린다 이러면 ones이라는 변수로 두가지 값 모두 구할 수 있다.
function solution(s) {
let num = s;
let count = 0;
let removedZero = 0;
while (num !== "1") {
let ones = 0;
for (let char of num) {
if (char === "1") ones++;
}
removedZero += num.length - ones;
num = ones.toString(2);
count++;
}
return [count, removedZero];
}
'개발 > 알고리즘(코딩테스트)' 카테고리의 다른 글
프로그래머스, 자바스크립트) 예산 (1) | 2025.05.22 |
---|---|
프로그래머스, 자바스크립트) 두 개 뽑아서 더하기 (0) | 2024.11.19 |
프로그래머스, 자바스크립트) 올바른 괄호 (0) | 2024.11.18 |
프로그래머스, 자바스크립트) JadenCase 문자열 만들기 (0) | 2024.11.17 |
프로그래머스, 자바스크립트) 최솟값 만들기 (0) | 2024.11.15 |