입출력예시
let output = computeWhenDouble(7);
console.log(output); // --> 11
output = computeWhenDouble(10);
console.log(output); // --> 8
function computeWhenDouble(interestRate) {
let result = 0
let x = 1;
for(let year = 1; x < 2; year = year + 1){
x = x + x * interestRate/100
result = year
}
return result
}
//원금이 연이자율에 따라서 점점 증가하고 증가한 원금의 2배 이상이 되었을 때 이 때가 몇년이냐?
//result 변수를 선언한다. 0을 할당해준다
//원금 변수 x를 선언한다. 1을 할당해준다.
//원금 + 원금*연이율 >= 원금 * 2 가 되는데 걸리는시간을 리턴해야한다
//위의 식은 연 이율이 몇이되어도 항상 true이다. // 1 + 1.1 >= 2 // 2 + 2.3 >= 4 //
//언젠가 원금의 2배이상이 된다는 소리다.
//원금의 2배가 안될때 까지의 year를 구한다. ==> 원금의 2배이상이될때까지 걸리는 기간을 구하는 것이다
//for문을 사용해준다. year을 선언해주고 1을 할당한다(연이율은 1년째부터 받는다)
//원금 x는 2보다 작아야한다. --> 마지막바퀴에 2.xx가 되면 그 시점에서 조건문에 맞지않아 반복문이 멈추기때문이다
//year는 1씩 증가한다.
//원금 x는 x + x * interestRate / 100 로 재할당 해준다
//result에 year을 재할당해준다
//result를 리턴한다
입출력예시
let output1 = powerOfTwo(16);
console.log(output1); // true
let output2 = powerOfTwo(22);
console.log(output2); // false
function powerOfTwo(num) {
if (num === 1) {
return true;
}
if (num % 2!== 0) {
return false;
}
let powered = 2;
while (powered < num) {
powered = powered * 2;
}
return powered === num;
}
//num를 입력받아 true / false 를 리턴해야한다
//만약 num 가 1이라면 true를 리턴한다
//만약 num를 2로 나누어 떨어진 나머지가 0이 아니라면 false를 리턴한다 (홀수는 false이다)
//변수 power를 선언해준다. 2로 할당해준다. <초기>
//while문을 사용해준다. power는 num보다 작아야한다. <조건>
//power는 power * 2가 된다. <증감>
//power === num 을 리턴해준다.
//이러면 true와 false가 알아서 된다.
입출력예시
let output = makeOddDigits(3);
console.log(output); // --> "135"
output = makeOddDigits(5);
console.log(output); // --> "13579"
function makeOddDigits(num) {
let result = ""
let odd = 1
let count = 0
while(count < num){
count = count + 1
result = result + odd
odd = odd +2
}
return result
}
//변수 result를 선언한다. ""를 할당한다.
//변수 odd를 선언한다. 1을 할당한다
//변수 count를 선언한다. count는 0을 할당한다. (num를 언제까지 돌릴지 정하기 위해)
//while문을 사용해준다.
//count가 0일때 odd는 1 // count가 1 odd는 3 // count가 2 odd는 5 //count가 3 odd 7//count가 4일때 odd 9
//odd = odd + 2
//result는 result + odd로 할당해준다.
//result를 리턴해준다.
엄청 많이 다시 풀어보는 반복문 8번.. 여전히 이해를 못했었구나 싶다 ㅎ
익숙해질때까지 계속 풀거다 흑흑 스스로 잘 풀때까지 계속 풀거다!!
입출력 예시
let output = listPrimes(2);
console.log(output); // --> '2'
output = listPrimes(6);
console.log(output); // --> '2-3-5'
output = listPrimes(18);
console.log(output); // --> '2-3-5-7-11-13-17'
코드
function listPrimes(num) {
let result = '2'
for(let i = 3 ; i <= num ; i ++){
let isPrime = true
for(let j = 2; j < i ; j++) {
if(i%j === 0) {
isPrime = false
break
}
}
if(isPrime === true){
result = result + '-' + i
}
}
return result
}
//변수 result를 선언한다. '2'를 할당한다
//for문을 만든다. i를 선언한다. 3을할당한다. i는 num와 같거나 작다. i는 1씩 커진다. (i는 소수)
//i는 소수이다. 변수 isPrime을 선언한다. true를 할당한다.
//내부 for문을 만든다. j를 선언한다.2로 할당한다. j는 i보다 작다. j는 1씩 커진다. (j는 나누는 수 이다.)
//만약 i를 j로 나누었을 때 나머지가 0이 된다면 isPrime을 false로 재할당한다. break를 추가한다.
//나머지가 0이 아니라면, isPrime은 true로 재할당된다.
//만약 isPrime이 true와 같다면 result = result + '-' + i 이다
//result를 리턴해준다.
isPrime의 위치를 for문 밖에 적었다
그러면 외부의 for문이 isPrime에 true인지 알 수 없다.
j가 나누는 수라는 것을 인지 못한채로 기계적으로 2중for문을 사용했다
항상 2중반복문을 풀 때는 변수들이 어떤 것을 의미하는지 인지하고 수도코드를 작성하자!
function getValueOfNthElement(arr, num) {
if(arr.length === 0){
return 'no name'
}
else if(num > arr.length -1){
return arr[arr.length -1]['name']
}
return arr[num]['name']
}
//객체를 요소로 갖는 arr의 num번째 name value값을 얻어내야한다.
//만약 arr의 길이가 0이라면 'no name'을 리턴받는다.
//그렇지 않다면
//arr[num]['name']이 나와야한다.
function extend(obj1, obj2) {
for(key in obj2){
if(obj1[key] === undefined){ //if(!(obj1[key]))
obj1[key] = obj2[key]
}
}
}
//obj2에 key가 있다고 가정하자
//만약 obj1에 key가 없다면
//obj1[key]는 obj2[key]와 같다
이 문제는 맨날 틀리는것 같다 ㅎ if안을 맨날 틀린다...
문제를 틀린 두번째 이유를쓰려고 확인하다보니 다른 방법으로도 풀어냈다
function extend(obj1, obj2) {
for(key in obj2){
if(key in obj1 !== key in obj2){
obj1[key] = obj2[key]
}
}
}
//만약 obj1의 key가 obj2의 key와 다르다면
//obj2의 key를 추가해준다.
위에있는 코드는 obj1에 key가 없다면 으로 해서 맞춘거고
밑에있는 코드는 obj1의 key와 obj2의 key가 다르다면을 조건으로 해서 맞춘 것이다