[TID][Lv 0] 코딩 테스트 연습_6

MoonEn·2023년 1월 12일
0

Today I Learned

목록 보기
7/8

해당 스토리는 코드테스트 공부 중에 새롭게 배운 내용을 기록하고 자기 반성을 위해 기록해 둔다.

외계행성의 나이

우주여행을 하던 머쓱이는 엔진 고장으로 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

profile
개발자를 꿈꾸는 직장인

0개의 댓글