Next bigger number with the same digits

SungJunEun·2021년 11월 14일
0

Codewars 문제풀이

목록 보기
15/26
post-thumbnail

Description:

Create a function that takes a positive integer and returns the next bigger number that can be formed by rearranging its digits. For example:

12 ==> 21
513 ==> 531
2017 ==> 2071
nextBigger(num: 12)// returns 21
nextBigger(num: 513)// returns 531
nextBigger(num: 2017)// returns 2071

If the digits can't be rearranged to form a bigger number, return -1 (or nil in Swift):

9 ==> -1
111 ==> -1
531 ==> -1
nextBigger(num: 9)// returns nil
nextBigger(num: 111)// returns nil
nextBigger(num: 531)// returns nil

My solution:

또 못풀었습니다...

Best solutions:

function nextBigger(n){
  console.log(n);
  var chars = n.toString().split('');
  var i = chars.length-1;
  while(i > 0) {
    if (chars[i]>chars[i-1]) break;
    i--;
  }
  if (i == 0) return -1;
  var suf = chars.splice(i).sort();
  var t = chars[chars.length-1];
  for (i = 0; i < suf.length; ++i) {
    if (suf[i] > t) break;
  }
  chars[chars.length-1] = suf[i]
  suf[i] = t;
  var res = chars.concat(suf);
  var num = parseInt(res.join(''));
  console.log("->" +num);
  return num;
}
  • array.splice(index,deleteCount,item1,item2,...) 배열의 요소를 삭제하고, 추가하여서 배열의 내용을 변경한다.
    • index

      배열 변경을 시작할 인덱스

    • deleteCount (Optional)

      배열에서 제거할 요소의 수

    • item1, item2, ... (Optional)

      배열에 추가할 요소

      주목해야할 점은 제거하는 요소를 반환하고, 원래의 배열은 해당 요소가 제거한 모습으로 변경된다.

    var myFish = ['angel', 'clown', 'drum', 'mandarin', 'sturgeon'];
    var removed = myFish.splice(3, 1);
    
    // removed is ["mandarin"]
    // myFish is ["angel", "clown", "drum", "sturgeon"]

전체 과정

  1. 문자열을 배열로 변환한다.

  2. 뒤에서부터 앞자리수가 뒷자리수보다 작은 경우의 뒷자릿수 index를 반환한다.

    ex) [2, 0, 7, 1]이면, 0 > 7 이므로, index = 2

  3. 만약 전부 앞자리수가 뒷자리수보다 크다면, 해당 숫자가 만들 수 있는 케이스 중에 가장 큰 것이기 때문에 이것보다 큰 숫자는 없으므로 -1을 반환한다.

    ex) '7210' → return -1

    그 외의 경우에서는

    1. suf 에 해당하는 인덱스부터 끝까지의 배열을 오름차순 순으로 정렬한 후 저장한다. 원래 chars 변수에는 suf 에 해당되는 값을 제외한 배열로 변한다.

      ex) suf = [7, 1].sort() = [1,7], char = [2,0]

    2. t 에는 chars 변수의 마지막 값이 저장된다.

      ex) t = 0

  4. suf 의 아이템을 순서대로 돌면서 t 보다 큰 값이 있으면 for문을 나간다.

    ex) i = 0, ( suf[0] = 1 ) > ( t = 0 ), → break

  5. chars 의 마지막 요소에 suf[i]를, suf[i]에는 t를 대입한다.

    ex) chars = [2, 1], suf = [0, 7]

  6. charssuf 를 합친 후, 문자열로 변환한다.

    ex) [2, 1, 0, 7] → '2107'

profile
블록체인 개발자(진)

0개의 댓글