[개발자되기: 반복문] Day-4

Kyoorim LEE·2022년 4월 28일
0

반복문

같거나 비슷한 코드를 여러번 실행시켜야 할 경우에 쓰는 구문

for 구문

  • 반복할 내용을 중괄호 block안에 넣어준다
  • 반복할 조건을 초기화/ 조건식/ 증감문 순으로 넣어준다
let sum = 1;
for(let n = 2; n <= 4; n = n + 1) {
  sum = sum + n; // 반복할 내용 
}
console.log(sum); // 10

ex) 구구단 출력

function mulTablePrinter(num) {
	for (let n = 1; n <= 9; n = n + 1) {
		console.log(num * n)
	}
}

function mulTablePrinter() {
	for(let n = 2; n <= 9; n = n + 1) {
		for(let m = 1; m <= 9; m = m + 1) {
			console.log(n * m)
		}
	}
}

function mulTablePrinter() {
	for(let n = 2; n <= 9; n = n + 1) {
		for(let m = 1; m <= 9; m = m + 1) {
			console.log(`${n} * ${m} = ${n * m}`)
		}
	}
}

while 구문

  • 반복할 조건 중 초기화, 증감문은 따로, 조건식만 괄호 안에 넣어준다
let sum = 1;
let n = 2;
while(n <= 4) {
  sum = sum + n;
  n = n + 1;
}
console.log(sum); // 10

문제 다시 보기

  1. findTheBug
  • 문제: 문자열을 입력받아 버그('#')의 인덱스를 리턴해야 합니다.
  • 인자 1 : word string 타입의 단어
  • 출력: number 타입을 리턴해야 합니다.
  • 주의 사항
    반복문(for)문을 사용해야 합니다.
    '#' 기호가 없는 경우 undefined를 리턴해야 합니다.
function findTheBug(word) {
  for (let i = 0; i <= word.length; i++) {
    if (word[i] === '#') {
      return i;
    }
  } return undefined;
}
  1. sumTo
  • 문제: 수를 입력받아 0부터 해당 수까지의 합을 리턴해야 합니다.
  • 인자 1 : number 타입의 정수 (num >= 0)
  • 출력: number 타입을 리턴해야 합니다.
function sumTo(num) {
  let sum = 0;
  for (let i = 1; i <= num; i++) {
    sum += i;
  } return sum;
}
  1. isOdd
  • 문제: 수를 입력받아 홀수인지 여부를 리턴해야 합니다.
  • 인자 1: number 타입의 정수
  • 출력: boolean 타입을 리턴해야 합니다.
  • 주의 사항
    반복문(while)문을 사용해야 합니다.
    for문 사용은 금지됩니다.
    나눗셈(/), 나머지(%) 연산자 사용은 금지됩니다.
    0은 짝수로 간주합니다.
function isOdd(num) {
  if (num < 0) {
    num = -num;
  }
  while (num >= 0) {
  	if (num === 1) {
    	return true;
    } else if (num === 0) {
      return false;
    }
  	num -= 2
  }
}

문제풀이: / or %를 쓸 수 없는 상황에서 홀수/짝수를 구분하기 위해서는 계속 2를 뺏을때(반복문) 나머지가 0인지 1인지로 구분할 수 있다

  1. makeDigits2
  • 문제: 수(num)를 입력받아 1부터 num까지의 정수로 구성된 문자열 리턴
  • 인자 1:number 타입의 정수 (num >= 1)
  • 출력: string 타입을 리턴해야 합니다.
  • 주의 사항
    반복문(while)문을 사용해야 합니다.
    for문 사용은 금지됩니다.
    숫자(number string) 사이를 '-'로 구분합니다. ('1-2-3-4-5')
function makeDigits2(num) {
  let result = '1';
  
  let i = 2;
  while (i <= num) {
    result += `-${i}`;
    i++;
  } return result;
}
  1. makeOddDigits
  • 문제: 수(num)를 입력받아 1을 포함하여 num개의 홀수로 구성된 문자열을 리턴
  • 인자 1: number 타입의 정수 (num >= 1)
  • 출력
    string 타입을 리턴해야 합니다.
    주의 사항
    반복문(while)문을 사용해야 합니다.
    숫자(number string) 사이의 구분은 없습니다. ('13579')
function makeOddDigits(num) {
  let result = '';
  
  let count = 0; 
  let i = 1;
  while (count < num) {
    result += String(i);
    i = i + 2;
    count++; 
  } return result;
}
  1. makeMultiplesOfDigits2
  • 문제: 두 개의 수를 입력받아 두 수를 포함해 두 수 사이의 수 중 2의 배수의 개수를 리턴
  • 인자 1:number 타입의 정수 (num1 >= 0)
  • 인자 2:number 타입의 정수 (num2 >= 0)
  • 출력
    number 타입을 리턴해야 합니다.
  • 주의 사항
    반복문(for)문을 사용해야 합니다.
    num1이 num2보다 작지 않을 수도 있습니다.
    0은 2의 배수가 아니라고 가정합니다.
function makeMultiplesOfDigit2(num1, num2) {
  // num1 과 num2 사이의 2의 배수의 개수를 리턴한다
  // TODO: 여기에 코드를 작성합니다.
  let count = 0;
  if (num1 >= num2) {
    for (num2; num2 <= num1; num2++) {
      if (num2 % 2 === 0 && num1 !== 0 && num2 !== 0) {
        count++;
      }
    }
  } else if (num1 < num2) {
    for (num1; num1 <= num2; num1++) {
      if (num1 % 2 === 0 && num1 !== 0 && num2 !== 0) {
        count++;
      }
    }
  } return count;
}
  1. getMaxNumberFromString
  • 문제: 숫자 문자열을 입력받아 문자열을 구성하는 각 숫자 중 가장 큰 수를 나타내는 숫자 리턴
  • 인자 1:str // string 타입의 숫자 문자열
  • 출력: string 타입을 리턴해야 합니다.
  • 주의 사항
    반복문(for)문을 사용해야 합니다.
    str.split 사용은 금지됩니다.
    빈 문자열을 입력받은 경우, 0을 리턴해야 합니다.
function getMaxNumberFromString(str) {
  let maxNum = 0;
  for (let i = 0; i < str.length; i++) {
    if (Number(str[i]) > maxNum) {
      maxNum = Number(str[i]); 
    }
  } return String(maxNum);
}
  1. replaceAll
  • 문제:문자열과 두 개의 문자(from, to)를 입력받아, 문자열에 등장하는 특정 문자(from)가 다른 문자(to)로 바뀐 문자열을 리턴
  • 인자 1 : str //string 타입의 문자열
  • 인자 2 : from //string 타입의 문자, from.length는 1
  • 인자 3 : to //string 타입의 문자, to.length는 1
  • 출력: string 타입을 리턴
function replaceAll(str, from, to) {
  let result = '';
  for (let i = 0; i < str.length; i++) {
    if (str[i] === from) {
      result += to;
    } else {
      result += str[i];
    }
  } return result;
}
  1. computePower
  • 문제: 밑(base)과 지수(exponent)를 입력받아 밑의 거듭제곱을 리턴
  • 인자 1 : base //number 타입의 밑
  • 인자 2 : exponent //number 타입의 지수
  • 출력: number 타입을 리턴
  • 주의 사항
    반복문(for)문을 사용해야 합니다.
    Math.pow, 거듭제곱 연산자 사용은 금지됩니다. (거듭제곱은 자바스크립트 표준 내장 객 체인 Math 객체를 통해 쉽게 구할 수 있습니다.)
function computePower(base, exponent) {
  let result = 1;
  for (let i = 0; i < exopnent; i++) {
    result *= base;
  } return result;
}
function computePoser(base,exponent) {
    return Math.pow(base,exponent); 
} 
  1. isPrime
  • 문제: 1 이상의 자연수를 입력받아 소수(prime number)인지 여부를 리턴
  • 인자 1: num -> number 타입의 수
  • 출력: boolean 타입을 리턴
  • 일반 풀이
function isPrime(num) {
  // 소수(prime number): 1과 자신만 그 수의 약수 -> 1과 자기 자신 이외에는 자연수로 나눌 수 없는, 대신 1보다 커야함
  // 1. 1보다는 커야한다
  // 2. 짝수는 제외 (단 2는 소수)
  // 3. 3부터 자기 자신보다 작은 수까지 나누어 떨어지는 경우가 단 한차례라도 있으면 그건 소수가 아님
  // TODO: 여기에 코드를 작성합니다.
  if (num === 1) {
    return false;
  }
  if (num === 2) {
    return true;
  }
  if (num % 2 === 0) {
    return false;
  }
  for (let i = 3; i < num; i++) {
    // num을 (3과 num사이에 있는 수)로 나눠서 나머지가 0인게 하나라도 있으면 그건 소수가 아님
    if (num % i === 0) {
      return false;
    }
  } return true;
}
  • 제곱근을 이용한 풀이
function isPrime(num) {
  // Math.sqrt()는 입력값의 제곱근을 구함 ex.Math.sqrt(100) === 10, Math.sqrt(16) === 8
  // parseInt는 소수점을 제외하고 정수를 리턴함
  let sqrt = paseInt(Math.sqrt(num));
  if (num === 1) {
    return false;
  }
  if (num === 2) {
    return true;
  }
  if (num % 2 === 0) {
    return false;
  }
  for (let i = 3; i <= sqrt; i+=2) {
    if (num % i === 0) {
      return false;
    }
  } return true;
}
  1. listPrimes (????)
  • 문제: 2 이상의 자연수를 입력받아 2부터 해당 수까지의 소수(prime number)들을 리턴해야 합니다.
  • 인자 1 : num -> number 타입의 정수 (num >= 2)
  • 출력
    string 타입을 리턴해야 합니다.
    2-3-5-7의 형식으로 리턴해야 합니다.
  • 주의 사항
    이중 반복문(double for loop)을 사용해야 합니다.
function listPrimes(num) {
  let result = '2';
  for (let i = 3; i <= num; i +=2) { // i는 소수, 소수는 무조건 홀수
    let isPrime = true;
    let sqrt = parseInt(Math.sqrt(i));
    for (let divider = 3; divider <= sqrt; divider += 2) {
      if (i % divider === 0) {
        isPrime = false;
        break; // 그때 멈춘다는 뜻
      }
    } if(isPrime) { // if(isPrime)??????
      result = `${result}-${i}`;
    } return result;
  }
  1. makePermutations (????)
  • 문제:문자열을 입력받아 해당 문자열에 등장하는 각 문자(letter)를 가지고 만들 수 있는 길이 2의 문자열들을 리턴해야 합니다.
  • 인자 1 : str -> string 타입의 문자열
  • 출력
    string 타입을 리턴해야 합니다.
    입력받은 문자열의 각 문자를 0, 1, 2, ..., n이라고 할 경우, 00,01,02,...,nn 형식으로 리턴해야 합니다.
  • 주의 사항
    이중 반복문(double for loop)을 사용해야 합니다.
    빈 문자열을 입력받은 경우에는 빈 문자열을 리턴해야 합니다
function makePermutations(str) {
  //str에 중복된 문자가 있다면 true 없으면 false를 리턴한다
  // TODO: 여기에 코드를 작성합니다.
  let result = '';
  for (let a = 0; a < str.length; a++) {
    for (let b = 0; b < str.length; b++) {
      result = result + `${str[a]}${str[b]},`;
    }
  } return result.slice(0, result.length - 1); // 이부분이 이해가 안감.. 그냥 return result; 하면되는거 아닌가...?
}
  1. hasRepeatedCharacter
  • 문제:문자열을 입력받아 해당 문자열에 중복된 문자(letter)가 존재하는지 여부를 리턴해야 합니다.

  • 인자 1 : str -> string 타입의 문자열

  • 출력: boolean 타입을 리턴해야 합니다.

  • 주의 사항
    이중 반복문(double for loop)을 사용해야 합니다.
    빈 문자열을 입력받은 경우에는 false을 리턴해야 합니다.

function hasRepeatedCharacter(str) {
  for (let a = 0; a < str.length; a++) {
    for (let b = a+1; b <= str.length; b++) {
      if (str[a] === str[b]) {
        return true;
      }
    }
  } return false;
}
  1. makeMarginalString
  • 문제: 문자열을 입력받아 해당 문자열을 처음부터 한 글자(letter)씩 다시 작성하려고 합니다. 이 때, 한 글자를 추가할 때마다 부분적으로 완성된 문자열을 전부 이어붙인 문자열을 리턴해야 합니다.

  • 인자 1 : str -> string 타입의 문자열

  • 출력: string 타입을 리턴해야 합니다.

  • 주의 사항
    이중 반복문(double for loop)을 사용해야 합니다.
    str.slice, str.substr, str.substring 사용은 금지됩니다.
    빈 문자열을 입력받은 경우에는 빈 문자열을 리턴해야 합니다.

function makeMarginalString(str) {
let result = '';
for (let a = 0; a <= str.length; a++) {
  for (let b = 0; b <=a; b++) {
    result += str[b];
  	}
  } return result;
}
    
profile
oneThing

0개의 댓글