문제 상황
하나의 숫자 num을 첫 번째 인자로 받아 처리하는 JavaScript 함수를 작성해야 합니다.
이 함수의 핵심 임무는 다음 규칙에 따라 숫자 뒤에 적절한 영어 서수 접미사('st', 'nd', 'rd', 'th')를 붙이는 것입니다.
- st: 끝자리가 1인 숫자에 사용 (예: 1st — first로 발음)
- nd: 끝자리가 2인 숫자에 사용 (예: 92nd — ninety-second로 발음)
- rd: 끝자리가 3인 숫자에 사용 (예: 33rd — thirty-third로 발음)
- 예외 규칙: 위 규칙과 달리, 11, 12, 13으로 끝나는 모든 숫자는 -th를 사용 (예: 11th — eleventh, 112th — one hundred [and] twelfth)
- th: 그 외의 모든 숫자에 사용 (예: 9th — ninth)
예를 들어 함수에 다음과 같은 값이 입력된다고 가정해 보겠습니다.
입력
const num = 4513;
출력
const output = '4513th';
출력 설명
4513은 일의 자리가 3으로 끝나기 때문에 얼핏 'rd'를 붙여야 할 것처럼 보이지만, 마지막 두 자리가 13이므로 예외 케이스에 해당합니다. 따라서 'th'가 붙어야 올바른 결과입니다.
구현 코드
다음은 이 문제를 해결하는 코드입니다.
const num = 4513;
const appendText = (num = 1) => {
let suffix = "th";
if (num == 0) suffix = "";
if (num % 10 == 1 && num % 100 != 11) suffix = "st";
if (num % 10 == 2 && num % 100 != 12) suffix = "nd";
if (num % 10 == 3 && num % 100 != 13) suffix = "rd";
return num + suffix;
};
console.log(appendText(num));
실행 결과
4513th
코드 동작 원리
이 코드의 핵심은 나머지 연산자(%)를 활용한 조건 분기입니다.
num % 10: 숫자의 일의 자리 값을 구해 어떤 접미사가 필요한지 판단합니다.num % 100: 마지막 두 자리 값을 확인하여 11, 12, 13이라는 예외 케이스를 걸러냅니다. 이 덕분에 4513처럼 3으로 끝나지만 13이 포함된 숫자에는 'th'가 유지됩니다.- 접미사 변수의 기본값을 'th'로 설정한 뒤, 각 조건에 해당할 때만 'st', 'nd', 'rd'로 덮어쓰는 방식이라 로직이 간결하고 가독성이 좋습니다.
- 입력값이 0일 경우에는 접미사 없이 숫자만 그대로 반환하도록 처리했습니다.
이처럼 몇 줄의 조건문만으로 영어권 날짜 표기나 순위 표시에 널리 쓰이는 서수 형식을 손쉽게 구현할 수 있습니다.