ALGORITHM

백준 2529 부등호 (Java)

공부하는_다온 2023. 6. 2. 20:00

1. 문제 링크

 

2529번: 부등호

여러분은 제시된 부등호 관계를 만족하는 k+1 자리의 최대, 최소 정수를 첫째 줄과 둘째 줄에 각각 출력해야 한다. 단 아래 예(1)과 같이 첫 자리가 0인 경우도 정수에 포함되어야 한다. 모든 입력

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

1. k+1개를 뽑아서 순열을 만든다.

2. 순열에서 나온 숫자들을 부등호랑 비교하면서 완탐한다

3. 처음부터 시작해서 최솟값을 찾고, 뒤에서부터 시작해서 최댓값을 찾는다.

 

경우의 수가 너무 많아서 각 자리별로 최소 이정도는 와야한다의 수를 찾고 싶었는데,

< > 랑 > < 의 경우에 탐색 순서가 달라서 포기했다..

 

4. 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

//45분
public class Main {
	static int N;
	static String[] bracket;
	static boolean visit[], flag;
	static int[] numbers;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		bracket = br.readLine().split(" ");
		visit = new boolean[10];
		numbers = new int[N+1];
		flag = false;
		reverse_permutation(0);
	
		visit = new boolean[10];
		flag = false;
		permutation(0);
	}
	
	private static boolean check(int[] numbers) {
		for(int i=0;i<N;i++) {
			String now = bracket[i]; //지금 부등호
			if(now.equals("<")) {
				if(numbers[i]>numbers[i+1]) {
					return false;
				}
			}
			else {
				if(numbers[i]<numbers[i+1]) {
					return false;
				}
			}
		}
		return true;
	}

	
	private static void permutation(int cnt) {
		if(cnt == N+1) {
			if(check(numbers)) {
				flag = true;
				for(int i=0;i<cnt;i++) {
					System.out.print(numbers[i]);
				}
				System.out.println();
			}
			return;
		}
		for(int i=0;i<10;i++) {
			if(visit[i]) {
				continue;
			}
			numbers[cnt] = i;
			visit[i] = true;
			permutation(cnt+1);
			if(flag) return; 
			visit[i] = false;
			
		}
	}
	private static void reverse_permutation(int cnt) {
		if(cnt == N+1) {
			if(check(numbers)) {
				flag = true;
				for(int i=0;i<cnt;i++) {
					System.out.print(numbers[i]);
				}
				System.out.println();
			}
			return;
		}
		for(int i=9;i>=0;i--) {
			if(visit[i]) {
				continue;
			}
			numbers[cnt] = i;
			visit[i] = true;
			reverse_permutation(cnt+1);
			if(flag) return;
			visit[i] = false;
			
		}
	}
}