알고리즘🅰/프로그래머스

[프로그래머스] 정수 내림차순으로 배치하기

개발조각 2022. 3. 2. 19:25
728x90
반응형

뭔가 3page에 있는 문제가 다 비슷비슷한 것 같아요.

 


해결방안

function solution(n) {
    return `${n}`.split('').sort((a,b)=> b-a).join('') / 1
}

해결방안 순서

  1. 숫자를 문자열로 만들기 : `${n}`
  2. 문자열을 각 자릿수로 나누어서 배열로 만들기 : split('')
  3. 배열을 내림차순으로 정렬하기 : sort((a,b)=> b-a)
  4. 배열을 문자열로 합치기 : join('')
  5. 문자열을 숫자로 만들기 : / 1

 

1단계. 숫자를 문자열로 만들기 : `${n}`

숫자에서는 split()메서드를 쓰면 오류가 나기 때문에 문자열로 바꾸어 주어야 됩니다.

그래서 저는 간단하게 "템플릿 리터럴"를 사용해서 바꾸어 주었습니다.

 

템플릿 리터럴 ("template strings" (템플릿 문자열))

  • ES6부터 새로 도입된 문자열 표기법입니다.
  • 문자열 생성 시 따옴표 대신, 백틱(`)을 사용합니다.
  • ${ } 사이에 변수나 연산 등을 삽입할 수 있습니다.
테스트 1 (n = 118372)
`${n}` -> '118372'

 

2단계. 문자열을 각 자리수로 나누어서 배열로 만들기 : split('')

split()메서드를 사용하여 각 자릿수를 나누어 배열로 만들어 주었습니다.

 

MDN Web Docs
split()  메서드는 String 객체를 지정한 구분자를 이용하여 여러 개의 문자열로 나눕니다.

구문 : str.split([separator[, limit]])

  • separator Optional
    원본 문자열을 끊어야 할 부분을 나타내는 문자열을 나타냅니다. 실제 문자열이나 정규표현식을 받을 수 있습니다. 문자열 유형의 separator가 두 글자 이상일 경우 그 부분 문자열 전체가 일치해야 끊어집니다. separator가 생략되거나 str에 등장하지 않을 경우, 반환되는 배열은 원본 문자열을 유일한 원소로 가집니다. separator가 빈 문자열일 경우 str의 각각의 문자가 배열의 원소 하나씩으로 변환됩니다.
  • limit Optional
    끊어진 문자열의 최대 개수를 나타내는 정수입니다. 이 매개변수를 전달하면 split() 메서드는 주어진 separator가 등장할 때마다 문자열을 끊지만 배열의 원소가 limit개가 되면 멈춥니다. 지정된 한계에 도달하기 전에 문자열의 끝까지 탐색했을 경우 limit개 미만의 원소가 있을 수도 있습니다. 남은 문자열은 새로운 배열에 포함되지 않습니다.
// split 예제
var myString = 'Hello World. How are you doing?';
var splits = myString.split(' ', 3);
console.log(splits); //["Hello", "World.", "How"]

// limit를 안 쓸 경우
let mystring = 'Hello';
console.log(mystring.split('')); // [ 'H', 'e', 'l', 'l', 'o' ]

 

테스트 1 (n = 118372)
`${n}` -> '118372'
`${n}`.split('') -> ['1', '1', '8', '7', '2']

 

3단계. 배열을 내림차순으로 정렬하기 : sort((a,b)=> b-a)

문제 설명에서 "n의 각 자릿수를 큰 것부터 작은 순으로 정렬"을 하라고 했습니다.

이 말은 내림차순을 하라는 말이라서 sor()메서드의 내림차순으로 써주었습니다.

문자열인 숫자는 안 먹을 줄 알았는데 잘 작동합니다.

 

MDN Web Docs
sort() 메서드는 배열의 요소를 적절한 위치에 정렬한 후 그 배열을 반환합니다.

구문 : 배열.sort(정렬 순서를 정의하는 함수)

 

sort() 메서드

  • sort((a,b)=>a-b); -> 오름차순
  • sort((a,b)=>b-a); -> 내림차순
테스트 1 (n = 118372)
`${n}` -> '118372'
`${n}`.split('') -> ['1', '1', '8', '7', '2']
`${n}`.split('').sort((a,b)=> b-a) -> ['8', '7', '2', '1', '1']

 

4단계. 배열을 문자열로 합치기 : join('')

배열을 합치기 위해 join()메서드를 사용해주었습니다.

 

MDN Web Docs
join() 메서드는 배열의 모든 요소를 연결해 하나의 문자열로 만듭니다.

구문 : arr.join([separator])

  • separator Optional
    • 배열의 각 요소를 구분할 문자열을 지정합니다. 
    • 이 구분자는 필요한 경우 문자열로 변환됩니다. 
    • 생략하면 배열의 요소들이 쉼표로 구분됩니다. 
    • separator가 빈 문자열이면 모든 요소들이 사이에 아무 문자도 없이 연결됩니다.
// join예제
var a = ['바람', '비', '불'];
var myVar1 = a.join();      // myVar1에 '바람,비,불'을 대입
var myVar2 = a.join(', ');  // myVar2에 '바람, 비, 불'을 대입
var myVar3 = a.join(' + '); // myVar3에 '바람 + 비 + 불'을 대입
var myVar4 = a.join('');    // myVar4에 '바람비불'을 대입

 

테스트 1 (n = 118372)
`${n}` -> '118372'
`${n}`.split('') -> ['1', '1', '8', '7', '2']
`${n}`.split('').sort((a,b)=> b-a) -> ['8', '7', '2', '1', '1']
`${n}`.split('').sort((a,b)=> b-a).join('') -> '87211'

 

5단계. 문자열을 숫자로 만들기 : / 1

마지막으로 join()메서드를 쓰면 문자열만 가능하지 숫자로는 못 만들어서 따로 숫자로 만들어주어야 됩니다.

다양한 메소드가 있겠지만 간단하게 "문자열과 숫자열의 사칙연산"으로 숫자를 구해주었습니다.

 

[프로그래머스] 문자열을 정수로 바꾸기에 다른 사람 풀이 보기에서 알게 된 건데요.

https://development-piece.tistory.com/26

 

[프로그래머스] 문자열을 정수로 바꾸기

이번 문제도 쉬운 편이라 빨리 풀었습니다. 해결방안 function solution(s) { return parseInt(s); return Number(s); } 이번 문제는 문자열을 정수로 바꾸는 문제입니다. 문자열을 정수로 바꾸는 대표적인 방법..

development-piece.tistory.com

문자열과 숫자열의 사칙연산은 숫자가 나오게 됩니다.

  • 5/1 = 5

이점을 활용해서 map() 메서드를 사용해 새로운 배열을 반환하게(문자열을 숫자로) 만들어 주었습니다.

 

테스트 1 (n = 118372)
`${n}` -> '118372'
`${n}`.split('') -> ['1', '1', '8', '7', '2']
`${n}`.split('').sort((a,b)=> b-a) -> ['8', '7', '2', '1', '1']
`${n}`.split('').sort((a,b)=> b-a).join('') -> '87211'
`${n}`.split('').sort((a,b)=> b-a).join('') / 1 -> 87211

여기까지 프로그래머스 정수 내림차순으로 배치하기 해결방안에 대해 설명해보았습니다.

728x90
반응형