문제풀이_반복문

future·2020년 12월 10일
3

문제풀이

목록 보기
2/6

#isOdd

수를 입력받아 홀수인지 여부를 리턴

  • 반복문(while)문을 사용
  • for문 사용은 금지
  • 나눗셈(/), 나머지(%) 연산자 사용은 금지
  • 0은 짝수로 간주
function isOdd(num) {
  
1. 만약 num이 0보다 작은 음수일 경우 (-num) + (-)를 하여 양수로 만들어준다.

  if (num < 0) {
    num = -num;
  }

2. 이제 반복조건은 num이 0보다 클 경우에 반복문이 돌아간다고 설정한다.
   만약 num이 1이랑 같을 경우에는 true를 리턴, num이 0과 같을 경우에는 false를 리턴한다.

  while (num >= 0) {
    if (num === 1) {
      return true;
    } else if (num === 0) {
      return false;
    }
    num = num - 2;
  }
   
3. 반복문을 빠져나오지 않은 상태에서 num이 1도 아니고 0도 아닐 경우,
   -2를 해줘서 num을 2씩 줄여준다.
   이제 num - 2가 된 상태에서 다시 반복조건에 들어간다.

4. num이 0 혹은 1이 될 때까지 반복문을 실행해준다.
   
}

#makeOddDigits

수(num)를 입력받아 1을 포함하여 num개의 홀수로 구성된 문자열을 리턴

  • 반복문(while)문을 사용
  • 숫자(number string) 사이의 구분은 없음 ('13579')
function makeOddDigits(num) {

1. 홀수로 구성된 문자열을 담을 변수를 선언해준다.

  let result = '';

2. i가 홀수가 될 때마다 1씩 카운팅 해주는 변수를 선언해준다. 0부터 카운팅 시작.
   1을 포함한 홀수를 리턴해야 하기 때문에 i는 1부터 시작해준다.
   count는 0부터 시작하고, num개의 횟수가 됐을 때 반복문을 종료해준다.

3. 카운트한 횟수(count)가 num보다 작을 경우, 
   결과값에 i를 더해준 후 count는 1씩 더 해주고,
   i는 홀수로 이어져야 하기 때문에 2를 더해줘서 3-5-7 식으로 홀수를 만들어준다.

  let count = 0;
  let i = 1;
  while (count < num) {
    result = result + i;
    count++;
    i = i + 2;
  }
  return result;
}

#makeMultiplesOfDigit2

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

  • 반복문(for)문을 사용
  • num1이 num2보다 작지 않을 수도 있음
  • 0은 2의 배수가 아니라고 가정
function makeMultiplesOfDigit2(num1, num2) {

1. 작은 순서대로 인자가 주어지는 것이 아니기 때문에
   먼저 start와 end 변수에 하나씩 넣어주고, 경우의 수가 다를 경우 위치를 바꿔준다.

  let start = num1;
  let end = num2;
  if (num1 > num2) {
    start = num2;
    end = num1;
  }

2. 0은 2의 배수가 아니라고 가정하기 때문에, start가 0일 경우 start를 1로 바꿔준다.

  if (start === 0) {
    start = 1;
  }

3. start부터 시작해서 end까지의 숫자 중 2의 배수의 '개수'를 리턴하는 것이기 때문에,
   개수를 세어줄 count라는 변수를 만들어준다.
   
4. 그리고 2의 배수를 걸러주는 조건문이 true일 경우 count+1를 해준다.

  let count = 0;
  for (let i = start; i <= end; i++) {
    if (i % 2 === 0) {
      count++;
    }
  }
  return count;

}

#getSumOfFactors

수를 입력받아 약수(factor)의 합을 리턴

function getSumOfFactors(num) {

1. 조건문이 true가 될 때마다 값을 더해줄 변수를 선언해준다.

  let sum = 0;
  
2. 반복문 초기값을 1부터 시작하여 num이 될 때까지 돌아가게 반복조건을 설정해준다.
   그리고 만약 num을 i로 나눴을 때 딱 떨어지는 경우 i를 sum에 더해준다.
   이 경우 i는 num의 약수가 되기 때문이다.
   
3. 반복문이 끝나면 최종 sum의 값을 리턴해준다.

  for (let i = 1; i <= num; i++) {
    if (num % i === 0) {
      sum = sum + i;
    }
  }
  return sum;
}

#isPrime

수를 입력받아 소수(prime number)인지 여부를 리턴

function isPrime(num) {

1. 2는 소수 중 유일한 짝수이기 때문에 조건문을 따로 써서 true를 리턴해준다.

  if (num === 2) {
    return true;
  }

2. i를 2부터 시작하기 때문에 num을 2로 나눠줬을 때 딱 떨어질 경우,
   num은 짝수이기 때문에 false를 리턴해준다. 

3. 조건문이 끝나면 i++을 해주면서 반복문이 돌아간다.

4. i <= num이 아닌 이유
   마지막에 num을 num으로 나눠주면 딱 맞아떨어져서 false가 리턴되기 때문이다.
   num이 소수일 경우에도 num으로 나눠주면 false가 리턴되기 때문에 num 직전의 수까지만 실행해준다.

  for (let i = 2; i < num; i++) {
    if (num % i === 0) {
      return false;
    }
  }
  return true;  
}

#listPrimes

수를 입력받아 2부터 해당 수까지의 소수(prime number)들을 리턴해야 한다.

  • string 타입을 리턴
  • 2-3-5-7의 형식으로 리턴
  • 이중 반복문(double for loop)을 사용
function listPrimes(num) {

1. 짝수 중 유일한 소수인 2는 리턴값의 가장 앞에 들어가기 때문에 미리 문자열로 만들어 할당해준다.

  let result = '2';

2. 첫 번째 반복문은 i부터 num까지 반복해주기 위한 코드이다.
   result에 할당된 2 다음 숫자인 3을 초기값으로 설정하고 반복될 때마다 1씩 더해준다.

  for (let i = 3; i <= num; i++) {

3. 소수인지를 판단해줄 isPrime이란 변수를 선언해준다.

    let isPrime = true;
    
4. 대입한 숫자(i)가 약수인지를 판단하기 위한 두 번째 반복문을 만들어준다.
   i가 짝수인지 판단하기 위해 초기값 j를 2로 할당해준다.
   만약 i를 j로 나눴을 때 나머지가 0으로 떨어질 경우, i는 짝수이므로 소수가 될 수 없다.

    for (let j = 2; j < i; j++) {
      if (i % j === 0) {
        isPrime = false;
      }
    }
    
5. 두 번째 반복문을 빠져나온 뒤 (아직 첫 번째 반복문 안에 있는 상태)
   소수인지 판단해주는 isPrime이 true일 경우의 조건문을 만들어주고,
   true일 경우 result에 '-'와 해당 숫자(소수)인 i를 더해서 할당해준다.

    if (isPrime === true) {
      result = result + '-' + i;
    }
  }
  return result;
}

#makePermutations

문자열을 입력받아 해당 문자열에 등장하는 각 문자(letter)를 가지고 만들 수 있는 길이 2의 문자열들을 리턴

  • 이중 반복문(double for loop)을 사용
  • 빈 문자열을 입력받은 경우에는 빈 문자열을 리턴
function makePermutations(str) { // 'abcd'
  
  let result = '';

  let start = 0;
  for (let i = start; i < str.length; i++) {
    for (let j = 0; j < str.length; j++) {
      result = result + str[i] + str[j] + ',';
    }
  }
  return result.slice(0, result.length - 1);
}

#hasRepeatedCharacter

문자열을 입력받아 해당 문자열에 중복된 문자(letter)가 존재하는지 여부를 리턴해야 한다.

  • 이중 반복문(double for loop)을 사용
  • 빈 문자열을 입력받은 경우에는 false을 리턴
function hasRepeatedCharacter(str) {
  for (let i = 0; i < str.length; i++) {
    for (let j = i + 1; j < str.length; j++) {
      if (str[i] === str[j]) {
        return true;
      }
    }
  }
  return false;
}

#makeMarginalString

문자열을 입력받아 해당 문자열을 처음부터 한 글자(letter)씩 다시 작성
한 글자를 추가할 때마다 부분적으로 완성된 문자열을 전부 이어붙인 문자열을 리턴

  • 이중 반복문(double for loop)을 사용
  • str.slice, str.substr, str.substring 사용은 금지
  • 빈 문자열을 입력받은 경우에는 빈 문자열을 리턴
function makeMarginalString(str) {  // str = 'abc'

1. 최종적으로 리턴할 문자열이 담을 변수를 선언해준다.

  let result = '';

2. j의 0번째 문자부터 입력 후, 그 다음 문자 또한 0번째부터 다시 입력해줘야 하기 떄문에
   j <= i를 반복조건으로 만들어준다.
   
3. i가 0이고 j도 0일 때, 'a'를 출력, 이후 j++를 해준다.
   i가 0이고 j가 1이 되면, 반복조건이 false가 되기 때문에 첫번째 for문으로 가서 i++를 해준다.
   i가 1이고 j가 0일 때, 'aa'를 출력, 이후 j++를 해준다.
   i가 1이고 j가 1이 되면, 'aab'를 출력, 이후 j++를 해준다.
   i가 1이고 j가 2가 되면, 반복조건이 false가 되기 때문에 첫번째 for문으로 가서 i++를 해준다.
   i가 2이고 j가 0일 때, 'aaba'를 출력, 이후 j++를 해준다.
   i가 2이고 j가 1일 때, 'aabab'를 출력, 이후 j++를 해준다.
   i가 2이고 j가 2일 때, 'aababc'를 출력, 이후 j++를 해준다.
   i가 2이고 j가 3일 때, 반복조건이 false가 되기 때문에 반복문은 종료된다.

  for (let i = 0; i < str.length; i++) {
    for (let j = 0; j <= i; j++) {
      result = result + str[j]; // 'aab
    }
  }
  return result;
}
profile
get, set, go!

0개의 댓글