https://school.programmers.co.kr/learn/courses/30/lessons/70129
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. 반성
- 처음에 재귀로 풀어보려고 했는데 잘 되지 않았다. 그래서 반복문을 사용했다.
- 반복문으로 풀고 나니 재귀로 풀려고 했던 코드가 틀리지 않았음을 알았고 반복문으로 푼 코드는 일부 테스트 코드에서 시간초과가 났다.
- 재귀로 다시 풀어보려는데 가장 중요한 함수를 안넘겨주고 있었다는 것을 알았고 함수를 입력해주면서 재귀를 완성시킬 수 있었다.
'코테연습' 카테고리의 다른 글
118. 올바른 괄호 Javascript (0) | 2022.09.12 |
---|---|
117. 최솟값 만들기 Javascript (0) | 2022.09.12 |
115. 최댓값과 최솟값 Javascript (0) | 2022.09.12 |
113. 백준 : 2960 에라토스테네스의 체 Javascript (0) | 2022.09.09 |
111. 백준 : 2839 설탕 배달 Javascript (0) | 2022.09.08 |
댓글