해당 스토리는 코드테스트 공부 중에 새롭게 배운 내용을 기록하고 자기 반성을 위해 기록해 둔다.
우주여행을 하던 머쓱이는 엔진 고장으로 PROGRAMMERS-962 행성에 불시착하게 됐습니다. 입국심사에서 나이를 말해야 하는데, PROGRAMMERS-962 행성에서는 나이를 알파벳으로 말하고 있습니다. a는 0, b는 1, c는 2, ..., j는 9입니다. 예를 들어 23살은 cd, 51살은 fb로 표현합니다. 나이 age가 매개변수로 주어질 때 PROGRAMMER-962식 나이를 return하도록 solution 함수를 완성해주세요.
age는 자연수입니다.
age ≤ 1,000
PROGRAMMERS-962 행성은 알파벳 소문자만 사용합니다.
나이를 각 자리 수의 숫자로 나누고, 알파벳의 index로 전달하여 값을 받으면 된다고 생각했다. 간단하게 999를 각 자리의 숫자로 구하면 다음과 같다.
그리고 4자리 숫자, 3자리 숫자 ... 1자리 숫자는 모두 나눠서 계산해야 하니, if-else if
문으로 각 자리의 숫자를 구별하였다. 각 자리의 숫자가 구해졌다면, 알파벳[숫자]
로 각 자리 숫자에 맞는 알파벳을 구하려 하였다. 이것을 구현하면 다음과 같다.
function solution(age) { const alphabet = 'abcdefghij' if (age >= 1000){ return alphabet[Math.floor(age/1000)]+alphabet[Math.floor((age%1000)/100)]+alphabet[Math.floor((age%100)/10)]+alphabet[age%10]; } else if(age>=100 && age < 1000){ return alphabet[Math.floor(age/100)]+alphabet[Math.floor((age%100)/10)]+alphabet[age%10]; } else if(age < 100 && age >=10){ return alphabet[Math.floor(age/10)]+alphabet[age%10]; } else{ return alphabet[age]; } } // Math.floor*를 사용한 것은 나눗셈 도중 무한소수가 나오는 경우가 있는데, 이를 방지하기 위해서 사용하였다.
매우 식이 복잡해보이지만 문제는 해결하였다. 그 후 다른 사람들의 코드를 보는데, 굉장히 내가 문제를 복잡하게 생각했다는 것을 알게 되었다.
다른 사람의 코드는 다음과 같다.
function solution(age) { let alphabet = 'abcdefghij' return Array.from(age.toString()).map(t => alphabet[+t]).join(''); } +t의 +는 형변환을 위해서 입력함.
간단하게 설명하면, age로 전달 받은 숫자를 Array.from(age.toString())
으로 배열로 만들고, map
메서드를 사용하여 alphabet
문자열의 index
로 숫자를 넣어서 각 숫자에 맞는 알파벳으로 다시 배열을 만들었다. 그리고 join
메서드를 이용하여 다시 하나의 문자열로 만들었다.
일단, 숫자를 배열로 간단하게 만드는 방법을 몰랐었다. 사실 생각이 났다면 방법을 찾았겠지만 생각도 나지 않았다. Array.from(age.toString())
을 테스트해보니 각 자리 숫자가 나뉘어져서 배열의 요소가 되었다.
Array.from('문자열')
이 들어가면, ['문', '자', '열']
이 되는 걸 활용하지 않았나 싶다. 그 뒤는 사실 방법은 동일하다. 숫자를 index
로 넘기는 것이니 말이다.
내가 쓴 코드보다 훠어어얼씬 짧고 간단한 해결에 나는 아직도 멀었다는 생각이든다. 문제 해결은 하지만 정말 잘 하고 있는 것인지 확인이 필요한 때인 것 같다.
*
Math.floor
- 주어진 숫자와 같거나 작은 정수 중에서 가장 큰 수를 반환 - 출처: MDN