0. 조건문 7, 8

2020. 6. 27. 22:50Retrospection/Sprint

7.

"convertScoreToGrade" 함수를 작성하세요.

점수가 주어졌을때, "convertScoreToGrade" 함수는 주어진 점수와 대응하는 등급을 문자열로 반환합니다.

Notes:

  • (100 - 90) --> 'A'

  • (89 - 80) --> 'B'

  • (79 - 70) --> 'C'

  • (69 - 60) --> 'D'

  • (59 - 0) --> 'F'

  • 만약 주어진 점수가 100을 초과하거나 0 미만이라면 문자열 INVALID SCORE 를 반환해야 합니다.

function convertScoreToGrade(score) {
  // 여기에 코드를 작성하세요
}
function convertScoreToGrade(score) {
    if(90 <= score && score <= 100){
        return 'A'
    }else if (80 <= score && score <= 89){
        return 'B'
    }else if (70 <= score && score <= 79){
        return 'C'
    }else if (60 <= score && score <= 69){
        return 'D'
    }else if (0 <= score && score <= 59){
        return 'F'
    }else {
        return 'INVALID SCORE'
    }
}

내가 한방법이 위의 방법이라면

function convertScoreToGrade(score) {
  let grade;
  if (score > 100 || score < 0) {
    return 'INVALID SCORE';
  }
  if (score === 100) {
    return 'A';
  }
  if (score >= 90) {
    grade = 'A';
  }
  else if (score >= 80) {
    grade = 'B';
  }
  else if (score >= 70) {
    grade = 'C';
  }
  else if (score >= 60) {
    grade = 'D';
  }
  else if (score >= 0) {
    grade = 'F';
  }
  return grade;
}

이런 식으로 100 이상 0이하 숫자 따로 , 

100 도 따로 리턴한뒤

뒤따르는 조건문들을 간단하게 만드는 방법도 있다. 

아래의 방법이 더 깨끗해보인다. 

 

아까 의사코드(수도코드) 작성법 이라는 글을 봤었는데 , 

좀 긴 코드를 써야 할때는 의사코드로 간단하게나마 정리해놓고 코딩을 시작하는것도 좋겠다. 

지금은 회고하느라 거의 3번째 보는 문제여서 아주 익숙해서 금방 짰지만 

처음할땐 좀 오래걸렸었기 때문에 ..

앞으로라도 의사코드 만드는 연습을 해보자 .  

 


8.

"convertScoreToGradeWithPlusAndMinus" 함수를 작성하세요.

점수가 주어졌을때, "convertScoreToGradeWithPlusAndMinus" 함수는 주어진 점수와 대응하는 등급을 문자열로 반환합니다.

Notes:

  • (100 - 90) --> 'A'
  • (89 - 80) --> 'B'
  • (79 - 70) --> 'C'
  • (69 - 60) --> 'D'
  • (59 - 0) --> 'F'
  • 만약 주어진 점수가 100을 초과하거나 0 미만이라면 INVALID SCORE 를 반환해야 합니다.
  • 만약 점수의 1의 자리가 0~2 사이라면 등급과 함께 '-'를 반환해야 합니다.
  • 만약 점수의 1의 자리가 8~9 사이라면 등급과 함께 '+'를 반환해야 합니다.
  • F+ 와 F- 는 존재하지 않습니다.
function convertScoreToGradeWithPlusAndMinus(score) {
  // 여기에 코드를 작성하세요
}

우선 코드가 좀 복잡해 보이기 때문에 의사코드를 작성해 보았다 

- 점수 1의자리 숫자에 따라 + -를 반환하는 함수를 만든다
    - function plusMinus 라는 이름으로 만든다
    - 매개변수를 num으로 한다
    - 1의자리가 0~2 인 숫자는 등급과 함께 -를 반환해야 한다
    - 1의자리가 3~7인 숫자는 등급과 함께 아무것도 반환하지 않아야 한다.
    - 1의자리가 8~9인 숫자는 등급과 함께 +를 반환해야 한다
    - 

- 숫자에 대응하는 문자를 리턴하는 함수를 만든다
    - 위의 function plusMinus (num) 함수를 let grade 으로 선언한다.
    - function convertScoreToGradeWithPlusAndMinus (score) 함수를 사용한다 .
    - 100-90 , 80-89 , 70-79 , 60-69 , 0-59 에 대응하는 문자를 리턴하는 조건문를 만든다
        - 여기서 100은 grade 를 더하면 -가 리턴되므로 따로 조건문을 만들어서 A+를 리턴한다. 
        - 각 조건문의 리턴값에 grade 를 더한다
        - 0-59 는 F+와 F- 가 존재하지 않는다
        - 주어진 점수가 0미만이거나 100을 초과 하는 조건문을 만들고  'INVALID SCORE '를 리턴한다

 

함수를 두개 만들었다. 

1. + - 반환 함수 

2. 등급 리턴 함수 

처음에는 2번

함수를 1번 함수에다가 대입시켜 보려고 했는데 0~59 는 +와 - 값이 없기때문에 그렇게 만들기가 어려울 것 같았다.

그래서 1번함수를 2번 함수에 활용하기로 했다.

 

function plusMinus(score){
    if(0 <= score%10 && score%10 <=2 ){
       return '-'
    }else if(score%10 === 8 || score%10 === 9){
        return '+'
    }else {
        return ''
    }
};

function convertScoreToGradeWithPlusAndMinus(score) {
    let grade = plusMinus(score);       //<----- let grade = function plusMinus(score)
                                        //        라고 하니까 에러가 계속 났다.                    
    if(100 === score){
        return 'A+'
    }else if(90 <= score && score <= 99){
        return 'A'+ grade
    }else if(80 <= score && score <= 89){
        return 'B'+ grade
    }else if(70 <= score && score <= 79){
        return 'C'+ grade
    }else if(60 <= score && score <= 69){
        return 'D' + grade
    }else if(0 <= score && score <= 59){
        return 'F'
    }else {
        return 'INVALID SCORE'
    }   
}

위의 코드가 내가 짠 코드 

두번째 하는건데도 엄청 헤맸다... 

다 잘 짠거같은데 에러가 자꾸 나서 보니까 let grade = function plusMinus 라고 했었다. 

함수 표현식 에서는 function을 쓰면 안되는데.. 

 

그리고 또 다른 코드로는 이런식으로 짤 수도 있다 . 

 

function plusOrMinus(score) {
  if (String(score)[1] <= 2) {
    return '-';
  }
  else if (String(score)[1] >= 8) {
    return '+';
  }
  else {
    return '';
  }
}

function convertScoreToGradeWithPlusAndMinus(score) {
  let grade;
  if (score > 100 || score < 0) {
    return 'INVALID SCORE';
  }
  if (score === 100) {
    return 'A+';
  }
  if (score >= 90) {
    grade = 'A';
  }
  else if (score >= 80) {
    grade = 'B';
  }
  else if (score >= 70) {
    grade = 'C';
  }
  else if (score >= 60) {
    grade = 'D';
  }
  else if (score >= 0) {
    grade = 'F';
  }

  if (grade !== 'F') {
    grade = grade + plusOrMinus(score);
  }
  return grade;
}

내가 구글링을 엄청 못하는건지... String(score)[1] 이게 뭔지 모르겠는데 

느낌상 일의자리 숫자를 스트링으로 도출해내는 함수인것 같다. 

확실히 10으로 나눠서 계산하지 않아도 되니 훨씬 간단하고 깔끔해 보인다. 

그리고 신기한것이 if 를 하나 쓰면 그다음 조건문에는 무조건 else if 를 쓰다가 else 로 마무리 해야되는줄 알았는데 

위의 코드에서는 if 가 세번이나 반복되서 쓰였고 

마지막 else 는 생략되었다. 

와 그리고 내 코드랑 같은 코드라고 생각했는데 , 

마지막에 

  if (grade !== 'F') {
    grade = grade + plusOrMinus(score);
  }
  return grade;

이부분이 정말 신기하다 . 

F 가 아닐경우 에만 grade 를 더해주는 방법이 있었구나 . 

그리고 처음에 let grade 라고 선언을 하고 

매번 리턴하지 않고 마지막에 더하고 나서 

grade 자체를 리턴하는것도 대박이다..

진짜 너무 재밌네 신기하다........

 

'Retrospection > Sprint' 카테고리의 다른 글

1. 문자열 1~3  (0) 2020.06.28
0. 조건문 9 , 10  (0) 2020.06.28
0. 조건문 4~6  (0) 2020.06.27
0. 조건문 1~3  (0) 2020.06.27
$-1 함수 1~3  (0) 2020.06.26