[coding Test]/Javascript

[코딩 테스트.js.06]

chef_coder 황인건 2024. 5. 10. 11:57

문제 설명

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를 들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.


제한 조건

n은 10,000,000,000이하인 자연수입니다.


해결 방안 1

function solution(n) {
    let answer = []
    let str =  (""+n);
    for(i=0; i<str.length; i++){
        answer.unshift(str[i]*1);
    }
    return answer;
}

1. answer 배열을 선언
2. n을 문자열로 형 변환. 공백문자열과 숫자를 더해, 문자열로 만들었다.  toString()을 사용해도 된다!
3. for문은 0부터, n의 자릿수만큼, 1씩 커지며 반복한다.
4. undershift를 통해 앞자리부터 answer배열에 맨 앞에 추가된다.

Troble shooting

코드가 너무 길다고 판단 되었다. 선언부가 여러 번 사용됐다. 분명 더 효율적인 방법이 있을 것이라 판단되었다.

1. map()

map()에 대한 이해도가 떨어져 사용할 생각조차 하지 못했다.


map() 함수는 기존 배열을 순회하며 지정된 콜백함수를 적용하여, 각 요소를 반환하고, 그 변환된 값을 모아서 새로운 배열로 반환한다.

2. parseInt( )

숫자로 형 변환을 할 때 *1밖에 못쓴다... 사실 이게 더 간결한 방법이지만, 해당 메서드를 모르고 *1을 쓰는건 어리석다 생각한다.

parseInt(string, radix);

string의 맨 앞에 숫자가 있다면 숫자형으로 형변환 해준다. 
만약 숫자가 아니라 문자가 들어와 있다면 NaN을 반환한다.
radix에는 몇 진법을 쓸지 결정하는 인자를 넣는다. (인자를 넣지 않으면, 10진법으로 처리)

3. reverse()

reverse()는 배열을 역순으로 바꾼다.

unshift()를 사용한 이유는 단순히 reverse()의 존재를 잘 몰랐기 때문이다.


해결 방안 2

function solution(n) {
	return (n+"").split("").reverse().map(newArr=> parseInt(newArr))
}

코드가 훨씬 간결해졌다.
1. n을 문자열로 형 변환
2. split() 메서드를 사용하여 배열반환
3. reverse()

Troble shooting

형 변환 없이 해결할 수는 없는 걸까?


해결 방안 3

ㄴfunction solution(n) {
    let arr =[];
    while(n>0){
       arr.push(n%10);
       n= Math.floor(n/10)
    }
    return arr
}

1. 배열 arr을 선언
2. while문, n이 0보다 클 때 참이다.
3. n을 10으로 나눈 나머지를 배열에 넣음
4. n을 10으로 나눈 후 Math.floor() 메서드로 소수점을 내림함.

형변환 없이 푸는 방식이다.

앞으로 숫자의 각 자릿수에 대한 문제를 풀 때 많이 적용 할 수 있을 것 같다.