코테연습
116. 이진 변환 반복하기 Javascript
hxunz
2022. 9. 12. 17:05
https://school.programmers.co.kr/learn/courses/30/lessons/70129
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 문제에 대한 이해
- 우리가 풀어야 할 문제는 무엇인가?
- s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return - 주어진 자료는 무엇인가?
- 0과 1로 이루어진 문자열 s - 조건은 무엇인가?
- 0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
- x의 모든 0을 제거합니다.
- x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
2. 계획
- s의 0의 개수를 구한다
- s의 모든 0을 제거합니다.
- s의 길이를 c라고 하면, s를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
3. 실행
- 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
첫번째 풀이
const solution = (s) => {
let change = 0;
let count = 0;
while (s !== '1') {
for (i = 0; i < s.split('').length; i++) {
if (s[i] === '0') {
count++
}
}
change++;
s = s.split('').filter((it) => it !== '0').join('').length.toString(2);
}
return [change, count]
}
두번째 풀이
const solution = (s, change = 0, count = 0) => {
if (s === '1') {
return [change, count]
}
//s의 0의 개수를 구한다
let countZero = s.split('').filter((it) => it === '0').length;
// s의 모든 0을 제거합니다.
let removeZero = s.split('').filter((it) => it !== '0').join('');
// s의 길이를 c라고 하면, s를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
let binary = removeZero.length.toString(2);
return solution(binary, change += 1, count += countZero)
}
4. 반성
- 처음에 재귀로 풀어보려고 했는데 잘 되지 않았다. 그래서 반복문을 사용했다.
- 반복문으로 풀고 나니 재귀로 풀려고 했던 코드가 틀리지 않았음을 알았고 반복문으로 푼 코드는 일부 테스트 코드에서 시간초과가 났다.
- 재귀로 다시 풀어보려는데 가장 중요한 함수를 안넘겨주고 있었다는 것을 알았고 함수를 입력해주면서 재귀를 완성시킬 수 있었다.