본문 바로가기

ALGORITHM

백준 2529 부등호 (Java)

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;
			
		}
	}
}

 

'ALGORITHM' 카테고리의 다른 글

백준 11724 연결 요소의 개수 (Java)  (0) 2023.06.04
백준 1459 걷기 (Java)  (0) 2023.06.03
백준 22251 빌런 호석 (Java)  (0) 2023.06.01
백준 9935 문자열 폭발 (Java)  (0) 2023.05.31
백준 16463 13일의 금요일 (Java)  (0) 2023.05.30