Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- XML주석
- 영어말하기
- XML
- dynamicProgramming
- 안드로이드주석
- 디피
- 오픽점수잘받는방법
- 다이나믹프로그래밍
- 주석
- 오픽가격
- stack 스택
- 이진탐색
- fibo
- English
- dp
- 메모이제이션
- 오픽
- opic
- 탑다운
- 이진탐색 #나무 자르기
- topdown
- 오픽공부법
- 안드로이드
- 피보나치수열
- ㅂ
- 영어회화
- 오픽노잼
- 오픽노잼공부방법
- 바텀업
Archives
RUBY
[백준] 이전 수열 본문
출처:: https://www.acmicpc.net/problem/10973
분류:: 브루트포스
1. 문제 이해 및 해결과정
- 다음 순열 문제(hiruby.tistory.com/521)와 알고리즘 유사 1) 감소하는 것들 중 가장 큰 인덱스 찾기 1-1) 감소하는 것들이 없다면, 가장 처음 오는 수열이 된다 2) 인덱스 i보다 큰 수 중 a[i]보다 더 작은 값 찾기 3) a[i]와 a[j] 값 swqp 4) i보다 큰 수들을 내림차순으로 배열 |
2. 풀이방법
1.
#이전순열
#https://www.acmicpc.net/problem/10973
import sys
sys.stdin = open("input.txt","r")
input=sys.stdin.readline
n=int(input())
a=list(map(int,input().split()))
def next_permutation(a):
i=-1
#1. 감소하는 것들중 가장 큰 인덱스 찾기
for index in range(len(a)-1):
if a[index]>a[index+1]:
i=index
#1-1. 없다면, 가장 처음오는 수열
if i==-1:
return -1
#2. 인덱스 i보다 큰 수 중 a[i]보다 더 작은 값 찾기
for index in range(i+1,len(a)):
if a[index]<a[i]:
j=index
#3. a[i]와 a[j] swap
a[i],a[j]=a[j],a[i]
#4. i보다 큰 수들을 역순(내림차순) 으로 배열
a=a[:i+1]+sorted(a[i+1:],reverse=True)
return a
res=next_permutation(a)
if res==-1: #사전 순으로 가장 처음 오는 수열일 경우
print(-1)
else:
print(' '.join(map(str,res)))
3. 오답원인
4. 알게된 점
'PS > BOJ' 카테고리의 다른 글
[백준] 가장 긴 바이토닉 부분 수열 (0) | 2020.10.02 |
---|---|
[백준] 차이를 최대로 (0) | 2020.10.02 |
[백준] 가장 큰 증가 부분 수열 (0) | 2020.10.02 |
[백준] 외판원 순회 2 (0) | 2020.10.02 |
[백준] 제곱수의 합 (0) | 2020.10.01 |
Comments