😎풀이

순열 중 내림차 순이 되는 포인트를 찾는다.(digits[i] <= digits[i + 1])
포인트보다 큰 수가 있다면 자리를 바꿔 최소 내림차 순을 만든다.
내림차 순을 뒤집어 큰 수가 뒷자리로 가게 해 가장 작은 수를 찾는다.

  1. 숫자를 배열로 변환 (1234 -> [1, 2, 3, 4])
  2. i번째 수가 i+1번째 수 이상인 인덱스 탐색
  3. i이후의 수 중 가장 자릿수가 낮은 더 큰 수 digits[j] 탐색
  4. i번째와 j번째의 수 교환
  5. i+1번째와 끝 인덱스부터 교환하며 진행
  6. 배열을 정수로 형변환하여 32비트 내로 표현 가능한 수인지 판별
  7. 범위 내 수라면, 해당 수 반환 그렇지 않다면 -1 반환
function nextGreaterElement(n: number): number {
    const digits = String(n).split('').map(Number)
    const len = digits.length
    let i = len - 2
    while(i >= 0 && digits[i] >= digits[i + 1]) {
        i--
    }
    if(i < 0) return -1
    let j = len - 1
    while(digits[j] <= digits[i]) {
        j--
    }
    [digits[i], digits[j]] = [digits[j], digits[i]]
    let left = i + 1
    let right = len - 1
    while(left < right) {
        [digits[left], digits[right]] = [digits[right], digits[left]]
        left++
        right--
    }
    const result = Number(digits.join(''))
    return result <= 2 ** 31 - 1 ? result : -1
};
profile
내 지식을 공유할 수 있는 대담함

0개의 댓글