본문 바로가기

Programming Language/JavaScript

[JavaScript]알고리즘과 수도코드

알고리즘은 무엇일까?

  • 어떤 문제를 해결하기 위한 일련의 절차나 방법을 정해진 형태로 표현한 것이다.
  • 문제 해결을 위한 고민을 논리적으로 풀어내는 작업을 하는 방법이다.

수도코드(pseudocode)는 무엇일까?

  • 개발에 앞서 문제 해결의 논리적인 과정을 인간의 언어로 작성하며 모든 과정을 좀 더 쉽게 확인 할 수 있는 것.

왜 쓸까?

  • 아무리봐도 소프트웨어의 동작 원리는 너무 복잡하기에, 좀 더 깔끔하고효율적인 알고리즘을 적용하기 위한 방법을 생각해내기 위해 쓴다.

어떻게 쓸까?

다음 문제를 보자.

더보기

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- 는 존재하지 않습니다.

입출력 예시

let output = convertScoreToGradeWithPlusAndMinus(91);
console.log(output); // --> 'A-'

나는 그저 조건문을 학습했고 수도코드 없이 논리적으로 풀어냈다.

function convertScoreToGradeWithPlusAndMinus(score) {
  if ( score < 0 || score >100) {
    return "INVALID SCORE";
  }
  else if (score >= 90) {
    if (score < 93) {
      return "A-"
    }
    else if (score >= 98) {
      return "A+"
    }
    else {
      return "A"
    }
  }
  else if (score >= 80) {
    if (score < 83) {
      return "B-"
    }
    else if (score >= 88) {
      return "B+"
    }
    else {
      return "B"
    }
  }
  else if (score >= 70) {
    if (score <73) {
      return "C-"
    }
    else if (score >= 78) {
      return "C+"
    }
    else {
      return "C";
    }
  }
  else if (score >= 60) {
    if (score < 63) {
      return "D-";
    }
    else if (score >= 68) {
      return "D+"
    }
    else {
      return "D";
    }
  }
  else {
    return "F";
  }
}

물론 이렇게 풀어도 되지만, 만일 요구사항이 늘어난다면 비효율적인 코드가 될 수도 있다. 가령 1의 자리를 더욱 세분화해 -- 또는 ++를 붙이게 된다면 모든 조건을 만드는 일은 더욱 번거로워진다. 

그래서 다음과 같이 수도코드를 생각해낸다.

더보기

문제 분해

이 문제는 크게 두 가지의 작은 문제로 분리할 수 있습니다.

  • 10의 자리로 Grade letter를 구분한다.
  • 1의 자리로 기호(+, -)를 구분한다.

수도코드(Pseudocode) 작성

수도코드를 작성하면서 프로그램이 동작하는 순서를 파악합니다.

  • score가 100이면, 즉시 A+가 최종 결과가 된다.
  • score에서 10의 자리를 얻어낸다.
  • score에서 1의 자리를 얻어낸다.
  • 10의 자리가 6이면, Grade Letter는 D 이다.
  • 10의 자리가 7이면, Grade Letter는 C 이다.
  • 10의 자리가 8이면, Grade Letter는 B 이다.
  • 10의 자리가 9이면, Grade Letter는 A 이다.
  • 1의 자리가 0~2 이면, (Grade Letter 뒤에 붙는) 기호는 -이다.
  • 1의 자리가 3~7 이면, (Grade Letter 뒤에 붙는) 기호는 빈 문자열이다(기호가 붙지 않는다).
  • 1의 자리가 8~9 이면, (Grade Letter 뒤에 붙는) 기호는 +이다.
  • Grade Letter와 기호를 문자열을 조합하여 최종 결과를 만든다.
  • 최종 결과를 리턴한다.

위 스도코드를 바탕으로 하나하나 차근차근

function convertScoreToGradeWithPlusAndMinus(score) {
  let tensdigit = Math.floor(score / 10)
  let unitsdigit = score % 10
  let gradeLetter

  if (score < 0 || score > 100) {
    return "INVALID SCORE";
  }
  else if (score === 100) {
    return "A+";
  }
  else if (score < 60) {
    return "F";
  }

  if (tensdigit === 6) {
    gradeLetter = "D"
  }
  else if (tensdigit === 7) {
    gradeLetter = "C"
  }
  else if (tensdigit === 8) {
    gradeLetter = "B"
  }
  else if (tensdigit === 9) {
    gradeLetter ="A"
  }

  let sign = ""

  if (unitsdigit >= 0 && unitsdigit <= 2){
    sign = "-"
  }
  else if (unitsdigit >= 8 && unitsdigit <= 9) {
    sign = "+"
  }

  return gradeLetter + sign
}

이렇게 이전보다 훨씬 효율적으로 작동하고 요구조건이 생겼을 때 추가하기도 용이한 코드가 완성되었다.

좋은 개발자와 나쁜 개발자를 나누는 기준이 바로 스도코드를 생각하느냐 마느냐 인 것 같다.

'Programming Language > JavaScript' 카테고리의 다른 글

[JavaScript]덧셈함수 구현하기  (0) 2022.02.21
[JavaScript]템플릿 문자열(Template string)  (0) 2022.02.16
[JavaScript]반복문  (0) 2022.02.15
[JavaScript]문자열(String)  (0) 2022.02.14
[JavaScript]조건문  (0) 2022.02.10