ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•

문제

 

10972번: λ‹€μŒ μˆœμ—΄

첫째 μ€„에 μž…λ ₯으둜 주어진 μˆœμ—΄μ˜ λ‹€μŒμ— μ˜€λŠ” μˆœμ—΄μ„ 좜λ ₯ν•œλ‹€. λ§Œμ•½, μ‚¬μ „μˆœμœΌλ‘œ λ§ˆμ§€λ§‰μ— μ˜€λŠ” μˆœμ—΄μΈ κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.

www.acmicpc.net

 

문제 풀이

 μ΄ λ¬Έμ œλŠ” νŠΉμ • μˆœμ—΄μ΄ μ£Όμ–΄ 질 λ•Œ λ‹€μŒ μˆœμ—΄μ„ μ°ΎλŠ” λ¬Έμ œμ΄λ‹€. c++의 경우 stl에 next permuation이 μžˆκΈ°μ— μ‰½κ²Œ ν’€ 수 μžˆμ§€λ§Œ, 파이썬의 경우 직접 κ΅¬ν˜„ν•˜μ—¬μ•Ό ν•œλ‹€. λ”°λΌμ„œ 파이썬으둜 ν’€κ²Œ 되면 λ‹¨μˆœνžˆ 라이브러리λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ•„λ‹Œ μ–΄λ–€μ‹μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€ μ•Œ 수 μžˆλ‹€.

 μ˜ˆμ‹œμ˜ 경우 주어진 μˆœμ—΄μ€ 1, 2, 3, 4둜 ν•΄λ‹Ή μˆœμ—΄μ˜ λ‹€μŒ μˆœμ—΄μ€ 1, 2, 4, 3이닀. λͺ¨λ“  μˆœμ—΄μ„ λ‚˜μ—΄ν•˜κ³  λ‹€μŒ μˆœμ—΄μ„ μ°ΎλŠ”κ²ƒμ€ λΉ„νš¨μœ¨μ μ΄λ‹€. λ”°λΌμ„œ κ·Έλ¦Όκ³Ό 같은 방식을 톡해 보닀 효율적으둜 λ‹€μŒ μˆœμ—΄μ„ 찾을 수 μžˆλ‹€.

  1. λ’€μ—μ„œ λΆ€ν„° μ‹œμž‘ν•˜μ—¬, 값이 μ¦κ°€ν•˜λŠ”μ§€ ν™•μΈν•˜μ—¬ i 값을 κ²°μ •ν•œλ‹€.

    • μ˜ˆμ‹œμ—μ„œλŠ” 값이 계속 μ¦κ°€ν•˜λ―€λ‘œ, κ²°μ •λœ i 값은 3이닀.
    • μ¦κ°€ν•˜λŠ” μˆ˜κ°€ ν•œ λ²ˆλ„ μ—†λ‹€λ©΄, λ‹€μŒ μˆ˜μ—΄μ΄ μ—†λŠ” κ²½μš°μ΄λ‹€.
  2. λ’€μ—μ„œ λΆ€ν„° μ‹œμž‘ν•˜μ—¬ κ²°μ •λœ i κ°’ - 1 λΆ€ν„° 순차적으둜 큰 값이 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.

  3. i와 j 값이 κ²°μ •λœλ‹€λ©΄ ν•΄λ‹Ή 값듀을 swapν•œλ‹€.

  4. λ§ˆμ§€λ§‰μœΌλ‘œ i, j에 μœ„μΉ˜ν•œ 값듀을 λ°˜μ „μ‹œν‚¨λ‹€.

 μ–΄λ €μš΄ μ•Œκ³ λ¦¬μ¦˜μ΄ μ•„λ‹ˆλ―€λ‘œ, λ‘œμ§μ„ κΈ°μ–΅ν•˜κ³  μž‘μ„±ν•  수 μžˆλ‹€λ©΄ λ‹€μ–‘ν•œ 문제λ₯Ό ν•΄κ²° ν•  수 μžˆλ‹€.

 

μ½”λ“œ

from sys import stdin


def prev_permutation(lst):
    length = len(lst) - 1
    i, j, k = [length for _ in range(3)]

    while i > 0 and lst[i - 1] >= lst[i]:
        i -= 1

    if not i:
        return 0

    while lst[i - 1] >= lst[j]:
        j -= 1

    lst[i - 1], lst[j] = lst[j], lst[i - 1]

    while i < k:
        lst[i], lst[k] = lst[k], lst[i]
        i += 1
        k -= 1
    return lst

if __name__ == '__main__':
    n = int(stdin.readline())
    nums = list(map(int, stdin.readline().split()))
    ret = prev_permutation(nums)
    print(-1) if not ret else print(*nums)

 

728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€