알고리즘 : 자연수 뒤집어 배열로 만들기

전은찬·2023년 1월 20일
0
post-thumbnail

코딩을 공부하면서 나는 알고리즘 실력이 부족하다는 것을 느꼈다.
사소한 알고리즘 문제도 구글링하고 구글링해서 찾아도 막상 적용하지 못하는 내가 많이 아쉬웠다.

그러다 오늘!
쉬운 문제였지만 혼자만의 힘으로 해결한 알고리즘 문제가 있어 작성해보려고 한다.
다시한번 말하지만 정말 정말 쉬운 문제인데...
이 문제보다 훨씬 더 쉬운 문제도 헷갈려했던 나라서 작성해본다.

자연수 뒤집어 배열로 만들기

문제 설명:
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요.
예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
제한 조건:
n은 10,000,000,000이하인 자연수입니다.
입출력 예:
n => 12345
return => [5,4,3,2,1]

먼저 console.log를 부랴부랴 찍어가며 작성한 리팩토링 전의 코드이다.

먼저 결과 값을 담을 빈배열 answer을 선언해주고
n = 12345 인 것으로 생각하고 문제를 풀어나갔다.

12345가 막상 읽으면 '일이삼사오'로 읽게 되지만 사실은 '만이천삼백사십오'이다.
그래서 주로 반복문에서 쓰이는 length가 먹히지않는다.
숫자는 길이가 없기때문에 문자열로 변환시키는 메서드 String을 써서 arr에 넣어주었다.

String(n), 즉 숫자 12345를 문자열 '12345'로 바꾸고,
반복문으로 문자열의 인덱스 값을 하나 하나 돌면서 순회할 때마다 인덱스 값을 하나씩 answer에 넣어주었다.

answer.push()는 answer라는 배열에 ()안의 값을 마지막 값으로 추가해주는 메서드이다.

그런데 여기서 console.log(answer)를 하면 ['1','2','3','4','5']가 나온다.
문자열의 인덱스 값을 넣어서![]
숫자가 아닌 문자로 들어간다.
그래서 문자열 arr의 인덱스 값이 answer에 들어가기 전에 Number 메서드를 사용하여 숫자로 넣어주어야 한다.

그렇게 하면 answer는 [1,2,3,4,5]로 반환할 수 있다.

그렇지만 원하는 리턴값은 [5,4,3,2,1]이기 때문에 배열을 반전시키는 메서드 reverse()를 사용해서 리턴해주면 원하던 리턴값을 받게 된다.

참고로 위처럼 반복문에서 인덱스 값을 반대로 불러오면 reverse()는 사용하지 않아도 된다.

이렇게 끝내도 정답이지만 개발자라면 리팩토링 과정을 거쳐야한다.

리팩토링:
결과의 변경 없이 코드의 구조를 재조장한다는 뜻이다.
가독성과 유지보수의 편의성을 높이기위해 사용된다.

리팩토링하면 이렇게 한줄로도 원하는 리턴값을 받을 수 있다.
한줄이지만 리팩토링 전의 코드와 일맥상통한다.

split() 메서드는 괄호 안의 지정한 구분자를 기준으로 문자열을 쪼갤 수 있다.

구분자를 split('') 이렇게 작성해주면 한글자 한글자 나눠주기때문에 ['1','2','3','4','5']를 불러온다.
이를 아까처럼 reverse() 메서드로 반전시킨 후에
for 반복문 대신 map() 메서드로 배열을 순회하며 주어진 함수를 적용시켜 결과값을 모아주었다.
주어진 함수는 parseInt로 문자열을 정수로 변환한 값을 리턴하는 함수이다.

// map()에 대한 설명은 전에 작성한 게시글
https://velog.io/@zeon8080/%EC%96%B4%EB%A0%A4%EC%9B%8C-map-filter 참고 //

profile
no record no memory

0개의 댓글