코드스테이츠_1주차_수

윤뿔소·2022년 8월 24일
0

CodeStates

목록 보기
4/47

반복문

  • 반복문을 활용하여 단순한 기능을 반복하여 수행
  • 반복문(for문)과 문자열, 숫자를 이용해 반복적으로 코드를 실행
  • 기본적인 for문 (for (let i = 0; i < 5; i++))을 응용하여 다양한 for문을 제작
  • for문과 while문의 차이에 관해서 설명
  • ⭐️반복문과 조건문을 응용하여 특정 조건에서만 코드가 실행되도록 의도
  • ⭐️이중 for문을 이해하고 활용 - 소수: 제곱근, 시간복잡도

반복문 작성법

for 구문

  • 이렇게 어떠한 걸 반복한다고 설계를 하고 코드 짜기
  • 중괄호 안에는 반복이 될 내용을 작성
  • 소괄호 안에는 (초기화, 조건문, 증감문) = (시작조건, 종료조건, 변화조건)
// 기본
let sum = 1
for (n = 2; n <= 4; n = n + 1) { // n++
  sum = sum + n;
} 
console.log(sum) // 10
// 두번째: 문자열 도출
for (let n=0; n<5; n++) { 
  console.log('Hello World')
} // Hello World 5번
// 세번째: 구구단, 조건 num * n, n이 1부터 9까지 반복돼야함
function mulTablePrinter(num) { 
	for (let n = 1; n <= 9; n = n + 1) { 
		console.log(num * n)
	}
}
for (n=1; n<=9; n++) { // 반복문의 반복문 활용
    console.log(mulTablePrinter(n))
}
  • 증감문에는 증감연산자를 사용 가능

    ++x : 먼저 피연산자의 값을 1 증가시킨 후에 해당 연산을 진행함.
    x++ : 먼저 해당 연산을 수행하고 나서, 피연산자의 값을 1 증가시킴.
    --x : 먼저 피연산자의 값을 1 감소시킨 후에 해당 연산을 진행함.
    x-- : 먼저 해당 연산을 수행하고 나서, 피연산자의 값을 1 감소시킴.

while 구문

  • while은 초기화는 따로 변수로 선언 및 할당해주고, 증감문은 while 구문 안에 써줘야함
  • for문 while문 둘다 사용 가능하다! 차이점은 while은 초기화, 증감문이 필요 없을 때 while을 써준다!
let sum = 1;
let n = 2;
while (n <= 4) { 
  sum = sum + n;
  n = n + 1
} 
console.log(sum)
  • 구구단 활용
function isOdd(num) {
  // TODO: 여기에 코드를 작성합니다.
  if (num < 0) {
    num = Math.abs(num)
  }
  while (num >= 0) {
    if (num === 1) {
      return true
    } else if (num === 0) {
      return false
    }
    num -= 2;
  }
}
  • while도 소수 판별 가능
function isPrime(num) {
  if (num === 0 || num === 1) {
    return false;
  }
  if (num === 2) {
    return true;
  }
  if (num % 2 === 0) { // 제곱근 안쓰면 짝수 빼는 조건문 안써도 됨
    return false;
  }
  let divisor = 3;
  while (divisor < Math.sqrt(num)) {
    if (num % divisor === 0) {
      return false;
    }
    divisor += 2
  }
  return true;
}

⭐️코플릿

10. 두 개의 수를 입력받아 두 수를 포함해 두 수 사이의 수 중 2의 배수의 개수를 리턴

for문 사용,인자는 모두 >=0

function makeMultiplesOfDigit2(num1, num2) {
  let small = num1;
  let big = num2;
  let count = 0;

  if (num1 > num2) {
    big = num1;
    small = num2;
  }
  for(i = small; i <= big; i++) {
    if (i % 2 === 0 && i !== 0) { // 2의 배수를 거름
      count += 1  // 개수 리턴
    }
  }
  return count;
}

⭐️17. 소수 판별 문제

소수 : 약수가 1과 자기자신 뿐인 수

// 17. 1 이상의 자연수를 입력, 불린 데이터 출력
function isPrime(num) {
  if (num === 1) { // 1은 소수 아님
    return false;
  }
  if (num === 2) { // 2를 제외한 짝수는 소수가 아님
    return true;
  }
  // 기본형
  for (devisor = 2; divisor < num; divisor++) { // 소수판별: 2부터 num-1까지 나눈 나머지가 0이 아님
    if (num % divisor === 0) {
      return false;
    }
  }
  // 범위 줄임: 약수의 대칭 특성을 이용함, 시간복잡도 ⬇️
  for (i = 3; i < Math.sqrt(num); i += 2) { // 약수의 절반만 보면 되니 ⭐️제곱근으로, 짝수 예외 처리
    if (num % i === 0) {
      return false;
    }
  }
  return true;
}

⭐️18. 소수를 판별해 활용

  1. 소수판별문 작성
  2. 출력을 보고 num이 커지면 커질 수록 출력값의 길이가 늘어남: 17번처럼 판별에서 끝나는 게 아니라 출력을 num까지의 소수를 계속 해줘야하기에 반복문이 필요, 써줘야함
  3. ⭐️조합하면 문자열 작성 반복문 X 소수 판별 반복문이 됨
  4. 그리고 반복이 끝나고 소수를 판별해 작성해줄 문자열 반환문을 써줘야함
    ⭐️ 반복문도 조건이 있기에 반복문이 조건문처럼 쓰일 수 있다! 불린이라든지 그런 값들을 조건에 맞게 수정 가능하다는 얘기
// 18. `num >= 2`부터 입력, 소수를 걸러 `num`까지 소수들을 출력: '2-3-5-...'
function listPrimes (num) {
  // 2를 선언, 범위 제거('+= 2')로 짝수 예외 처리
  let prime = '2'; 
  // divisor가 소수라면 if문에 넣어줄지 말지
  for (divisor = 3; divisor <= num; divisor += 2) { // 문자열 작성 반복문
    // 3 5 7 9 11 13 15... : 문자열에 쓸지말지의 범위를 정함
    // ⭐️divisor가 새로 돌 때마다 true로 초기화
    let train = true; 
    // for(let k = j * 2; k <= num; k += divisor){로 더 줄일 수 있음
    for (i = divisor; i < divisor; i += 2) { // 소수 판별 반복문
      // 3 5 7 9 11 13 15... : 소수 판별, ⭐️제곱근 써줘도 됨
      if (divisor % i === 0) {
        train = false;
        // 시간복잡도를 줄이기 위해 break 삽입
        break // 안써줘도 if문이 한번이라도 만족하면 train이 false가 돼버려 문자열에 안나옴
      }
    }
    if (train === true) { // 불린을 받아 문자열 반환
      prime = `${prime}-${divisor}`
    }
  }
  return prime
}

의사코드
1. 소수 판별 해야함
2. 소수 판별 후 걸러진 것들을 일일이 순서대로 써줘야함 - 입력된 숫자 속 여러개의 소수를 전부 써줘야하기에 !반복문!
3. 그러므로 판별 후 써줘야 하기에 2부터 num까지의 숫자들 제시 - 판별 반복문 - 소수 출력 문자열 순으로 과정을 이해: 숫자 제시 안 2가지 모듈을 장착
4. 그래서 문자열 작성 기계가 let, for(안의 for), if 순으로 짝수 거름 - 소수 판별 - 문자열 배치의 구성으로 작성해야함
5. 작성하고 시간복잡도를 줄일 수 있는 방안 모색

⭐️팁
debugger; 함수(): 브라우저가 명령을 처리하는 과정을 보여주고 변수의 값에 뭐가 있는지 보여줌, 진짜 좋음! 코드에 어디가 문제인지 보여줌!! 특히 반복문!

profile
코뿔소처럼 저돌적으로

0개의 댓글