본문 바로가기
백준/완전탐색

백준 10973. 이전순열

by 29살아저씨 2021. 8. 26.
반응형

🅰 백준 10973. 이전순열

 

10973번: 이전 순열

첫째 줄에 입력으로 주어진 순열의 이전에 오는 순열을 출력한다. 만약, 사전순으로 가장 처음에 오는 순열인 경우에는 -1을 출력한다.

www.acmicpc.net

✏️ 문제 풀이

  • 이전순열은 다음순열과 마찬가지로 np를 이용해서 풀었다.
  • 하지만 내림차순으로 정렬되어야 하기 때문에 앞에서 부터 탐색을 하기 위해 np함수 내 데이터의 부등호만 변경해주었다.

✏️ 소스코드

package bruteforce;

import java.io.*;
import java.util.*;

public class Main_실버3_10973_손은성 {

	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int N = Integer.parseInt(br.readLine());
		int numbers[] = new int [N];
		StringTokenizer st = new StringTokenizer(br.readLine());
		for (int i = 0; i < N; i++) {
			numbers[i] = Integer.parseInt(st.nextToken());
		}
		
		if(np(numbers)) {
			for (int i = 0, end = numbers.length; i < end; i++) {
				sb.append(numbers[i]+" ");
			}
			System.out.println(sb);
		}else
			System.out.println("-1");
	}
	
	// prev_permutation 구하기(내림차순으로 순열 정렬)
	
	private static boolean np(int numbers[]) {
		int N = numbers.length-1;
		
		int i = N;
		while(i>0 && numbers[i-1] <= numbers[i]) --i;		// 데이터의 부등호 위치만 변경해줌
		if(i == 0)
			return false;
		
		int j = N;
		while(numbers[i-1] <= numbers[j]) --j;				// 데이터의 부등호 위치만 변경해줌
		swap(numbers,i-1,j);
		
		int k = N;
		while(i<k) swap(numbers,i++,k--);
		return true;
	}
	
	private static void swap(int numbers[], int i, int j) {
		int temp = numbers[i];
		numbers[i] = numbers[j];
		numbers[j] = temp;
	}

}

 

✅ 후기

  •  

 

반응형

'백준 > 완전탐색' 카테고리의 다른 글

백준 9095. 1, 2, 3 더하기  (0) 2021.08.26
백준 10974. 모든 순열  (0) 2021.08.26
백준 10972. 다음 순열  (0) 2021.08.26
백준 1476. 날짜 계산  (0) 2021.08.26
백준 11723. 집합  (0) 2021.08.26

댓글