Programming Language/JavaScript
[JavaScript]알고리즘과 수도코드
마손(Mason)
2022. 2. 11. 11:40
알고리즘은 무엇일까?
- 어떤 문제를 해결하기 위한 일련의 절차나 방법을 정해진 형태로 표현한 것이다.
- 문제 해결을 위한 고민을 논리적으로 풀어내는 작업을 하는 방법이다.
수도코드(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
}
이렇게 이전보다 훨씬 효율적으로 작동하고 요구조건이 생겼을 때 추가하기도 용이한 코드가 완성되었다.
좋은 개발자와 나쁜 개발자를 나누는 기준이 바로 스도코드를 생각하느냐 마느냐 인 것 같다.