프론트엔드/Javascript 연습과제 해답

반복문 연습과제 해답

syleemomo 2023. 6. 29. 15:22
728x90

https://learnjs.vlpt.us/basics/08-loop.html

 

08. 반복문 · GitBook

반복문은 특정 작업을 반복적으로 할 때 사용할 수 있는 구문입니다. for 문은 가장 기본적인 반복문입니다. 특정 값에 변화를 주어가면서 우리가 정한 조건이 만족된다면 계속 반복합니다. 한번

learnjs.vlpt.us

 

아래와 같이 조건을 주면 맨 처음 i 값이 0 이므로 numbers[i] 는 1 이 된다. 그러므로 numbers[i] > 3 이 거짓이 된다. 그러므로 while 문 내부는 실행되지 않는다. 

function biggerThanThree(numbers) {
    const filteredNumbers = []
    let i = 0
    while(i < numbers.length && numbers[i] > 3){
        filteredNumbers[i] = numbers[i]
        i++ 
    }
    return filteredNumbers
}

const numbers = [1, 2, 3, 4, 5, 6, 7];
console.log(biggerThanThree(numbers)); // [4, 5, 6, 7]

아래와 같이 하면 i 값이 배열의 길이보다 크면 반복문을 빠져나온다. 즉, i 값이 증가하지만 배열의 원소를 조회할때까지만 반복문이 실행된다. 

function biggerThanThree(numbers) {
    const filteredNumbers = []
    let i = 0
    while(i < numbers.length){
        if(numbers[i] > 3){
            filteredNumbers[i] = numbers[i]
        }
        i++ 
    }
    return filteredNumbers
}

const numbers = [1, 2, 3, 4, 5, 6, 7];
console.log(biggerThanThree(numbers)); // [4, 5, 6, 7]

아래와 같이 하면 제대로 된 결과를 출력한다. 해당 코드에서 j 는 새로운 배열에 값을 저장하기 위한 인덱스값이고 i 는 원본배열의 값을 조회하기 위한 인덱스이다. 만약 j 없이 i 만 사용해서 filteredNumbers[i] 라고 실행하면 i 값이 3 이상일때만 새로운 배열에 저장되므로 i 값이 3보다 작을때 filteredNumbers 배열의 값은 비어있게 된다. 

function biggerThanThree(numbers) {
    const filteredNumbers = []
    let i = 0, j = 0 
    while(i < numbers.length){
        if(numbers[i] > 3){
            filteredNumbers[j] = numbers[i]
            j++
        }
        i++ 
    }
    return filteredNumbers
}

const numbers = [1, 2, 3, 4, 5, 6, 7];
console.log(biggerThanThree(numbers)); // [4, 5, 6, 7]

 

for 문을 사용하면 아래와 같이 작성할 수 있다. 

function biggerThanThree(numbers) {
const filteredNumbers = []
for(let number of numbers){
    if(number > 3){
        filteredNumbers.push(number)
    }
}
return filteredNumbers
}

const numbers = [1, 2, 3, 4, 5, 6, 7];
console.log(biggerThanThree(numbers)); // [4, 5, 6, 7]
function biggerThanThree(numbers) {
  /* 구현해보세요 */
  const filteredNumbers = []
  let i = 0 
  for(let number of numbers){
    if(number > 3){
      filteredNumbers[i] = number 
      i++
    }
  }
  return filteredNumbers
}

const numbers = [1, 2, 3, 4, 5, 6, 7];
console.log(biggerThanThree(numbers)); // [4, 5, 6, 7]

https://ko.javascript.info/while-for

 

while과 for 반복문

 

ko.javascript.info

우선 사용자가 100보다 작은 수를 입력하면 반복적으로 프롬프트 창을 띄워야 하므로 반복문을 사용해야 한다. 하지만 사용자가 100보다 작은 수를 몇번 입력하는지 알 수 없기 때문에 반복횟수가 정해져 있는 for 문을 사용하기 힘들다. 그래서 while 문을 사용하고 있다. 또한, prompt 로 입력받은 값은 문자열 형태이기 때문에 숫자로 변환해주어야 한다. 

빈 문자열을 입력하거나 100보다 큰 수를 입력하면 프롬프트 창을 띄우지 않는다. 반대로 생각하면 빈 문자열을 입력하지 않고 동시에 100보다 작은 값을 입력하면 반복해서 프롬프트 창을 띄워주면 된다. 집합의 개념을 빌리면 A 집합이 빈 문자열을 입력한 경우라고 하고, B 집합이 100보다 큰 수를 입력한 경우라고 한다면 이 두개의 집합의 합집합 A U B 의 여집합이다. 즉, 둘다 아닌 경우이다. 또한, prompt 로 입력받은 값은 문자열 형태이므로 비교를 위하여 숫자 형태로 변환해준다. 

let inputValue = Number(prompt('100보다 큰 값을 입력하세요 '))
while(inputValue && inputValue <= 100){
  inputValue = Number(prompt('100보다 큰 값을 입력하세요 '))
}

빈 문자열을 입력하지 않은 경우는 값이 존재한다는 의미이므로 사용자가 입력한 값 그대로 검사해주면 된다. 사용자가 입력한 값이 있으면 inputValue 는 Truthy 이므로 값이 존재한다. 하지만 사용자가 값을 입력하지 않으면 inputValue 는 falsy 이므로 더이상 프롬프트 창은 나오지 않는다. 

아래와 같이 parseInt 나 플러스 기호(+)를 사용해도 문자열이 숫자로 형변환된다. 

let inputValue = parseInt(prompt('100보다 큰 값을 입력하세요 '))
 while(inputValue && inputValue <= 100){
   inputValue = parseInt(prompt('100보다 큰 값을 입력하세요 '))
 }
let inputValue = +prompt('100보다 큰 값을 입력하세요 ')
while(inputValue && inputValue <= 100){
    inputValue = +parseInt(prompt('100보다 큰 값을 입력하세요 '))
}

아래와 같이 블록 안에서 const, let 을 이용하여 사용자가 입력한 값(inputValue)를 재정의하게 되면 블록을 벗어나면서 사라진다. 즉, 사용자가 입력한 최신값으로 업데이트가 되지 않는다. 결과적으로 while 문 밖에서 사용자가 처음에 입력한 inputValue 값을 계속 읽어오기 때문에 만약 처음에 100보다 작은 값을 입력해서 while 문 안에 들어왔다면 더이상 빠져나가지 못하고 무한루프에 빠진다. 

const inputValue = Number(prompt('100보다 큰 값을 입력하세요 '))
while(inputValue && inputValue <= 100){
    const inputValue = Number(prompt('100보다 큰 값을 입력하세요 '))
}
let inputValue = Number(prompt('100보다 큰 값을 입력하세요 '))
while(inputValue && inputValue <= 100){
    let inputValue = Number(prompt('100보다 큰 값을 입력하세요 '))
}
let inputValue = Number(prompt('100보다 큰 값을 입력해주세요'))
console.log(inputValue)
while(inputValue !== 0 
  && inputValue < 100){
    inputValue = Number(prompt('100보다 큰 값을 입력해주세요'))
  }
728x90