카테고리 없음
[프로그래머스 Level 2] 이진 변환 반복하기
y_flm
2025. 3. 21. 12:47
문제:
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 함수를 완성해주세요.
문제 풀어보기: https://school.programmers.co.kr/learn/courses/30/lessons/70129
풀이보기
더보기
function solution(s) {
let count = 0;
let zeroCount = 0;
let arr = s.split('');
let trans = '';
let result = [];
while(trans !== '1') {
arr.forEach((el) => {
if(el === '0') {
zeroCount++;
}
})
let filter = arr.filter(str => str !== '0');
trans = filter.length.toString(2);
count++;
arr = trans.split('');
}
result.push(count, zeroCount);
return result;
}
문제를 풀기 전 반복해야하는 순서를 정했다.
1. 0의 개수를 센다.
2. 0을 삭제한다.
3. 0을 삭제한 문자열의 길이를 2진수로 변환한다.
4. 변환한 횟수를 카운트한다.
5. s가 1인지 확인하고 아니면 다시 1번부터 반복한다.
이렇게 문제를 풀으려면 while문을 쓰는 것이 적합하다고 판단했다.
while문의 조건은 s가 1일 때까지 반복하도록 작성하고, forEach를 통해 0의 개수를 세어준다.
그 다음 filter 메서드를 활용하여 0을 제거한 배열을 반환해준다.
필터링한 배열의 길이를 통해 2진수 변환을 하고 trans에 저장해준다.
변환할 때마다 count를 더해주고, 여기서 주의할 점은 반복을 위해 trans를 다시 배열로 변환하여 arr에 저장해줘야한다.
그럼 s가 1이 될 때까지 해당 코드를 실행하고, 마지막에는 count(변환 횟수)와 zeorCount(0의 개수)를 리턴해주면 끝!
근데 보다보니 return 할 때 굳이 result를 선언하지 않아도 될 것 같다.
function solution(s) {
let count = 0;
let zeroCount = 0;
let arr = s.split('');
let trans = '';
while(trans !== '1') {
arr.forEach((el) => {
if(el === '0') {
zeroCount++;
}
})
let filter = arr.filter(num => num !== '0');
trans = filter.length.toString(2);
count++;
arr = trans.split('');
}
return [count, zeroCount];
}