240126 TIL ✍
주말에 금욜거 TIL을 적다니 좀.. 잘못됐지만 ㅎㅎ 공부 좀 하다가 TIL 적는다는게 미뤄져서ㅠㅠ 지금이라도 금욜에 배웠던 점을 정리해보기로 했다 -!
사실 요새는 아직도 저번 과제 To Do List 프로젝트를 보완하거나 했던 걸 복습하는 데에 매달리고 있다. .ㅠㅠ 다시 코드를 보니 이해가 안가는 점도 있고 다시 활용하기 어려울 것 같기도해서 확실히 해두려고 하고 있다.
또 베이직반 과제로 css- flex 를 사용해 카드 디자인을 추가하거나 기능을 추가해야해서 그것두 오늘 마무리지어야 할 듯 하당 🐋
이번에도 프로그래머스 알고리즘 문제를 정리!!
정수 n을 매개변수로 입력받아서, n을 내림차순으로 (큰 수 -> 작은 수) 정렬한 새로운 정수를 리턴해주는 함수를 만들면 된다. 예를 들어, 정수 n이 118372라면, 873211을 반환하는 것!
이렇게 하려면, 처음 입력받은 n을 (n의 각 자리 수들을 원소로) 배열로 만들어
배열메서드를 통해 내림차순으로 정렬해준 후,
다시 이 배열에서 원소들을 연결해 숫자로 만들어줘야 한다.
(숫자 -> 배열 -> 숫자)
그런데 숫자를 한자리 씩 쪼개기는 어렵기 때문에,
보통 문자열로 만들어 준 후, 각각 자리의 수를 쪼개서 배열에 넣어주는 방법이 많았다. (나 역시 그렇게 풀었다)
(but 나중에 말할 마지막 3번째 방법은 숫자 상태로 푼 방법)
- 그리고 문자열에서 문자 하나하나 쪼개 => 배열 만들 때엔 Array.from 이나 split 메서드를 사용할 수 있다.
그리고 배열 상태에서 배열 정렬 메서드, sort() 를 사용해 내림차순으로 정렬해준 후,
다시 각각의 원소들을 합쳐서 - join() 메서드 - 하나의 문자열로 만들어 ("873211"처럼)
숫자화를 마지막에 해주는 것이다. (parseInt나, Number 등의 메서드를 사용할 수도 있고,
아니면 문자열에 사칙연산을 해버려서.. 숫자화를 해주는 방법도 있었다
- 어떤 게 속도면에서 빠른 방법인지는 모르겠지만.)
1)
처음의 내 방법은, 하나하나 (메서드 처리할때마다) 변수에 담아서 해본 방법이었다 ... ㅠㅠ
그래서 길고 굳이 이렇게 써야 하나 싶은.
하지만 차근차근 주석으로 스스로에게 설명하면서 해보았다.
숫자-> 문자열 (String메서드)
문자열 -> 문자 하나하나 숫자로 만들어 원소화해서 배열 만들기 (Array.from과 mapfn 정의해 사용)
내림차순 정렬 (sort메서드)
원소들 합치기 (join메서드)
문자열 -> 숫자 (Number메서드)
근데 보면 알겠지만 풀긴하는데 약간 바보같은 방법이다.
mapfn까지 정의해 숫자화를 해놓고 결국 다시 문자열-> 숫자 과정을 거치는.. ㅋㅋㅋ
function solution(n) {
const str = String(n); // 숫자->문자열
const mapfn = (arg) => Number(arg);// 배열로 만들때, 배열원소들을 숫자화시켜줄 mapfn 정의
const numArr = Array.from(str, mapfn);
// 문자열->배열(Array.from메서드) & 원소를 숫자화(mapfn)
const descArr = numArr.sort((a,b) => b-a); //numArr 숫자 원소들을 내림차순으로 정렬
const descStr = descArr.join(''); //내림차순된배열(descArr)의 원소들을 하나의 문자열로
return (Number(descStr)); //문자열->숫자
}
2)
다른 사람 풀이들도 참고해보고 다시 풀어봤는데,
일단 위처럼 할거같으면 array.from 쓸 필요가 없고 그냥 split메서드가 낫다. (일단 문자 원소로 배열만들기)
> function solution(n) {
return(parseInt(n.toString().split('').sort().reverse().join('')));
}
그리고 이렇게 한 줄로 코드를 짜려면, 아무래도
String( ) 해서 담는 식보다는, toString() 메서드와 같이 바로 뒤에 붙여 쓸 수 있는 메서드가 좋을 것이다.
Array.from보다 split메서드가 한 줄로 이어서 짜기 좋을 것이고!
또 이번 기회에 sort 메서드도 처음으로 활용해보았는데,
sort() 배열메서드는 배열의 원소들을 정렬시켜주는데 그냥 sort() 로 쓰면 기본적으로 오름차순이 적용된다.
그런데 유니코드 문자 방식으로 정렬을 해주기 때문에,
문자는 a-b-c.. 순서에서 맨 앞자리부터 따지는 (일반적인?) 방식이고
숫자로 치자면, 역시 맨 앞자리부터 큰수 작은수를 따져서, [3, 12, 4]를 (오름차순) 정렬하면 [12, 3, 4] 가 된다..
그냥 작은수 -> 큰수로 오름차순 정렬이 아니고, 맨 앞자리 수가 작은 지 큰 지를 따진다.
여튼 여기서는 한자리 수마다 따질 거라서 그냥 sort()를 쓰면 되겠다.
그리고 reverse 메서드로 뒤집어주면 내림차순이 됨
3)
또 다른 풀이도 봤는데, 오!! 새롭게 깨달은 방법이었다.
일단 실행속도 면에서, 문자로 바꿔서 하기보다는 숫자 상태에서 실행시켜야 빠르다고 한다.
언젠가 n%10 이런 방식으로 숫자 한자리씩 꺼내는 거 봤던 거 같긴 한데, 여튼 아래 방법은 유용하게 쓰일 듯 하니 잘 기억해둬야겠담.
여러자리 수에서 각 자리 수 하나하나씩 빼내서 배열의 원소로 하나씩 넣어주는 것!
do while 반복문 사용해 맨 처음에 한번은 실행하도록 해서 반복시킴
nums 배열에 push메서드로 n%10 을 하나씩 원소로 넣어주기
다음 반복문 돌릴 수 n은 Math.floor(n/10)을 해서 한자리씩 떼가면서 또 돌린다.
(118372 -> n%10인 2를 push
=> 118372/10 = 11837.2 에서 소수점이하떼고 11837로 n 재할당해서
=> 또 반복문 돌리면 -> 7 push 이런 식)
글고 마지막은 sort, join동일한데 숫자화 시켜주는 방법으로 사칙연산을 썼다. 문자열에 *1을 해줌으로써 숫자화
function solution(n) {
//숫자가 분명히 더 빠름
var nums =[];
do{
nums.push(n%10);
n=Math.floor(n/10);
} while(n>0) // 이부분까지 좀 기억해둬야할거같다 !!!! 많이 쓰일 수 있을듯.
return nums.sort((a,b)=>b-a).join('')*1;
}
'Today what I Learned _TIL' 카테고리의 다른 글
[React] "styled-components" 패키지로 CSS in JS 방식의 스타일 부여하기 (1) | 2024.02.01 |
---|---|
[개인 Project] My To-Do List -React페이지 보완하기 (추가,삭제,완료버튼+날짜입력 및 오름차/내림차순 정렬 과제하기) (0) | 2024.01.29 |
[Algorithm_JS] 프로그래머스 문제풀이 : 정수 제곱근 판별 (1) | 2024.01.26 |
[React] CRA 보다 빠른 Vite로 React 프로젝트 생성하기 (0) | 2024.01.24 |
[개인 Project] My To-do List 페이지 만들기 _ 간단한 회고 (0) | 2024.01.24 |