[Algorithm_JS] 정수 내림차순으로 배치하기

2024. 1. 28. 17:48·✍️ Today what I Learned _TIL
SMALL

240126 TIL ✍

주말에 금욜거 TIL을 적다니 좀.. 잘못됐지만 ㅎㅎ 공부 좀 하다가 TIL 적는다는게 미뤄져서ㅠㅠ 지금이라도 금욜에 배웠던 점을 정리해보기로 했다 -!

사실 요새는 아직도 저번 과제 To Do List 프로젝트를 보완하거나 했던 걸 복습하는 데에 매달리고 있다. .ㅠㅠ 다시 코드를 보니 이해가 안가는 점도 있고 다시 활용하기 어려울 것 같기도해서 확실히 해두려고 하고 있다.

또 베이직반 과제로 css- flex 를 사용해 카드 디자인을 추가하거나 기능을 추가해야해서 그것두 오늘 마무리지어야 할 듯 하당 🐋


이번에도 프로그래머스 알고리즘 문제를 정리!!

프로그래머스 - 정수 내림차순으로 배치하기 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

정수 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;
  }
SMALL

'✍️ 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
'✍️ Today what I Learned _TIL' 카테고리의 다른 글
  • [React] "styled-components" 패키지로 CSS in JS 방식의 스타일 부여하기
  • [개인 Project] My To-Do List -React페이지 보완하기 (추가,삭제,완료버튼+날짜입력 및 오름차/내림차순 정렬 과제하기)
  • [Algorithm_JS] 프로그래머스 문제풀이 : 정수 제곱근 판별
  • [React] CRA 보다 빠른 Vite로 React 프로젝트 생성하기
련디
련디
FE - 개발 공부의 기록
  • 련디
    Ryeon's Devstory
    련디
  • 전체
    오늘
    어제
    • 분류 전체보기 (69)
      • 🪴 JavaScript & TypeScript (11)
        • 🧩 Algorithm (6)
      • 🪴 React (12)
      • 🪴 Next.js (8)
      • 🪴 HTML & CSS (2)
      • 🪴 DB & BaaS (5)
      • 🪴 Git &Github (0)
      • ✍️ 프로젝트 과정 & 회고 (18)
      • ✍️ Today what I Learned _T.. (11)
      • 🕊️ IT 아티클 (0)
      • etc. (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • My Github 😺
    • 네이버 블로그 🎵🎧 (일상,음악 등)
  • 공지사항

  • 인기 글

  • 태그

    타입스크립트
    Array.filter
    배열 메서드
    컴포넌트분리
    route handler
    Vite
    티스토리블로그스킨
    State
    렌더링패턴
    리액트쿼리
    오블완
    NVM
    비동기통신
    Supabase
    props
    axios
    reacthook
    BAAS
    Next.js
    fetch
    json-server
    useEffect
    웹개발 기초
    react
    티스토리챌린지
    tailwind
    의존성배열
    useMutation
    reactquery
    에러
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
련디
[Algorithm_JS] 정수 내림차순으로 배치하기
상단으로

티스토리툴바