조건문, 반복문_연습문제

유슬기·2022년 12월 22일
0

프론트엔드

목록 보기
6/64
post-thumbnail
코플릿에서 어려웠거나 인상깊었던 문제만 작성해 보았습니다.

convertScoreToGradeWithPlusAndMinus

문제

점수를 입력받아 점수에 해당하는 등급을 리턴

입력

인자 1: score

  • number 타입의 정수

출력

string 타입을 리턴해야 합니다.
각 등급의 최저 점수는 아래와 같습니다. ('F'의 경우 최대 점수를 표기)

90 이상 --> 'A'
80 이상 --> 'B'
70 이상 --> 'C'
60 이상 --> 'D'
60 미만 --> 'F'

만약 주어진 점수가 100을 초과하거나 0 미만인 경우, 문자열 'INVALID SCORE'를 리턴해야 합니다.
각 등급의 최고 점수보다 7점 이하인 경우, 등급과 함께 '-'를 리턴해야 합니다. (단, 93점의 경우에는 A를 리턴해야 합니다.)
각 등급의 최저 점수보다 8점 이상인 경우, 등급과 함께 '+'를 리턴해야 합니다.
F+ 와 F- 는 존재하지 않습니다.

풀이

function convertScoreToGradeWithPlusAndMinus(score) {
  let sign = score % 10 // 점수 1의자리 구하기
  if (score >= 90 && score <= 100) {
    if (sign >= 8 || score === 100) { // score = 100이거나 1의자리 숫자가 8 이상인 경우
      return 'A+'
    } else if (sign <= 2) { // 1의자리 숫자가 2 이하인 경우
      return 'A-'
    }
    return 'A';
  } else if (score >= 80 && score <= 89) {
    if (sign >= 8) {
      return 'B+'
    } else if (sign <= 2) {
      return 'B-'
    } else {
    return 'B';}
  } else if (score >= 70 && score <= 79) {
    if (sign >= 8) {
      return 'C+'
    } else if (sign <= 2) {
      return 'C-'
    }
    return 'C';
  } else if (score >= 60 && score <= 69) {
    if (sign >= 8) {
      return 'D+'
    } else if (sign <= 2) {
      return 'D-'
    }
    return 'D';
  } else if (score >= 0 &&score < 60) { // F는 +, - 없이 리턴
    return 'F';
    // 점수가 위의 모든 조건을 충족하지 않는 경우(100을 초과하거나 0 미만인 경우),
    // 문자열 'INVALID SCORE'를 리턴
  } else {
    return 'INVALID SCORE'; 
  }
}

여기서 + - 기호를 붙여주는 함수를 따로 만들어 붙여주면 코드 가독성이 더 좋을 것 같다.

function plusOrMinus(score) {
  let sign = score % 10 // 점수 1의자리 구하기
  if (sign >= 8) { // 1의자리 숫자가 8 이상인 경우
    return '+'
    } else if (sign <= 2) { // 1의자리 숫자가 2 이하인 경우
      return '-'
    } else { // 그 외
      return ''
    } 
}

function convertScoreToGradeWithPlusAndMinus(score) {
  let grade; // A-F까지의 값을 넣을 변수를 선언
  if (score === 100) { // score = 100인 경우
    return 'A+'
  }

  if (score >= 90 && score <= 100) { // 점수 범위에 따른 등급 나눠주기
    grade = 'A';
  } else if (score >= 80 && score <= 89) {
    grade = 'B';
  } else if (score >= 70 && score <= 79) {
    grade = 'C';
  } else if (score >= 60 && score <= 69) {
    grade = 'D';
  } else if (score >= 0 &&score < 60) {
    grade = 'F';
  } else {
    return 'INVALID SCORE';
  }

  if (grade !=='F') {
    return grade + plusOrMinus(score) // grade가 F가 아닌 경우, 기호 붙여서 리턴
  } else {
    return grade // 그 외(grade === 'F')에는 grade만 리턴
  }
}

isPrime

문제

1 이상의 자연수를 입력받아 소수(prime number)인지 여부를 리턴

입력

인자 1 : num

  • number 타입의 수

출력

boolean 타입을 리턴

풀이

function isPrime(num) {
  // 소수: 1과 자기 자신으로만 나누어지는 수
  
  // 0,1은 소수가 아님
  if (num < 2) {
    return false;
  }
  
  // 2를 제외한 짝수는 소수가 아님
  if (num === 2) {
    return true;
  }
  if (num % 2 === 0) {
    return false;
  }
  
  // 2까지는 위에서 확인 했으므로 3부터 확인, 홀수만 확인하면 되니 증감식은 2씩 더하기
  for (let i = 3; i < num; i+=2) {
    if (num % i === 0) { // num 자신보다 작은 수 까지 나누었을 때 딱 떨어지는 수가 있다면
      return false;
    } 
  }
  return true;
}

불필요한 연산을 줄이기 위해 소수 확인하는 for문에서 num의 제곱근(이하 정수) 까지만 확인하는 조건식으로 변경해도 됨

function isPrime(num) {
  // 소수: 1과 자기 자신으로만 나누어지는 수
  
  // 0,1은 소수가 아님
  if (num < 2) {
    return false;
  }
  
  // 2를 제외한 짝수는 소수가 아님
  if (num === 2) {
    return true;
  }
  if (num % 2 === 0) {
    return false;
  }
  
  // 2까지는 위에서 확인 했으므로 3부터 확인, 홀수만 확인하면 되니 증감식은 2씩 더하기
  for (let i = 3; i <= Math.floor(Math.sqrt(num)); i+=2) {
    if (num % i === 0) { // num의 제곱근 이하 정수까지 나누었을 때 딱 떨어지는 수가 있다면
      return false;
    } 
  }
  return true;
}

listPrimes

문제

2 이상의 자연수를 입력받아 2부터 해당 수까지의 소수(prime number)들을 리턴

입력

인자 1 : num

  • number 타입의 정수 (num >= 2)

출력

string 타입을 리턴해야 합니다.
2-3-5-7의 형식으로 리턴해야 합니다.

주의 사항

이중 반복문(double for loop)을 사용해야 합니다.

풀이

function listPrimes(num) {
  // 2 이상의 자연수를 입력받아 2부터 해당 수까지의 소수들을 리턴해야 합니다.
  // 2-3-5-7의 형식으로 리턴해야 합니다.
  // 외부 반복문: 2부터 자기자신(num)까지 반복하면서 내부반복문 실행 + 문자열 추가
  // 내부 반복문: 이 수가 소수인지 판단
  
  let result = '2'; // 무조건 2로 시작할 예정이므로 문자열 '2' 할당
  for (i = 3; i <= num; i += 2) {
    let isPrime = true; // 소수 판단 값을 넣어줄 변수 선언
    // 소수 판단 식
    for (let j = 3; j <= Math.floor(Math.sqrt(num)); j += 2 ) {
      if (i % j === 0) {
        isPrime = false;
      }
    }
    if (isPrime === true) { // 소수인 경우 result에 문자열 추가
      result = result + `-${i}`
    }
  }
  return result;
}

makeMarginalString

문제

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

입출력 예시

let output = makeMarginalString('abc');
console.log(output); // --> 'aababc'

output = makeMarginalString('flower');
console.log(output); // --> 'fflfloflowfloweflower'

output = makeMarginalString('');
console.log(output); // --> ''

풀이

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

  // 외부반복문: 반복횟수 결정. str의 길이만큼 반복
  for (let i = 0; i < str.length; i++) {
    // 내부반복문: 몇 개의 문자를 더해줄건지(문자열 추가를 몇 번 반복할건지)
    for (let j = 0; j <= i; j++) {
      result = result + str[j]
    }
  }
  return result
}
profile
아무것도 모르는 코린이

0개의 댓글