🌞Algorithm/🔥Baekjoon

[Baekjoon] 2529_부등호

뿌야._. 2023. 12. 1. 14:37

Silver I

문제(출처: https://www.acmicpc.net/problem/2529)

< 부등호 >

 

문제 풀이 

 

만들 수 있는 모든 조합을 구하면서 부등호에 만족하는 값만 다음 값으로 넘겨준다.

 

 my solution (Java)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class _2529_ { // 부등호
	static int num[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	static char arr[];
	static int result[];
	static boolean visited[];
	static String max, min;

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;

		int k = Integer.parseInt(bf.readLine());

		arr = new char[k];
		st = new StringTokenizer(bf.readLine());
		for (int i = 0; i < k; i++) {
			arr[i] = st.nextToken().charAt(0);
		}

		result = new int[k + 1];
		visited = new boolean[10];
		max = "-1";
		min = "100000000000";

		search(0, k);

		bw.write(max+"\n"+min);
		bw.flush();
	}

	private static void search(int idx, int k) {
		if (idx == k + 1) {
			String answer = "";
			for (int i = 0; i < k + 1; i++) {
				answer += result[i];
			}
			if (Long.parseLong(max) < Long.parseLong(answer)) {
				max = answer;
			}
			if (Long.parseLong(min) > Long.parseLong(answer)) {
				min = answer;
			}
			return;
		}
		for (int i = 0; i < 10; i++) {
			if (!visited[i]) {
				if (idx == 0) {
					result[idx] = num[i];
					visited[i] = true;
					search(idx + 1, k);
					visited[i] = false;
				} else {
					if (arr[idx - 1] == '<') {
						if (result[idx - 1] < num[i]) {
							result[idx] = num[i];
							visited[i] = true;
							search(idx + 1, k);
							visited[i] = false;
						}
					} else if (arr[idx - 1] == '>') {
						if (result[idx - 1] > num[i]) {
							result[idx] = num[i];
							visited[i] = true;
							search(idx + 1, k);
							visited[i] = false;
						}
					}
				}
			}
		}
	}
}
변수)
num : 0~9까지 저장한 배열
arr : 부등호 정보
result : 조합
visited : 방문 여부
max, min : 최대, 최소 정수
k : 부등호 문자의 개수

 

max와 min 값은 조합으로 만들 수 없는 -1과 100000000000 값으로 초기화시켜 준다. 모든 변수를 초기화시킨 후 search 함수를 호출한다.

 

0부터 9까지의 숫자를 전체 탐색하며 아직 사용하지 않은 값인지 확인한다. 아직 사용하지 않았으며 첫 번째 값이라면 어떤 숫자던지 넣을 수 있으므로 값을 넣고 다음 값을 구하기 위해 search 함수를 호출한다. 첫 번째 값이 아니라면 부등호를 보고 부등호 조건에 일치할 경우 다음 search 함수를 호출한다.

조합을 사용하여 k+1개의 숫자를 다 구했다면 max와 min 값과 비교하여 값을 교체한다.

 

최종 max와 min 값을 출력한다.



 

'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글

[Baekjoon] 4883_삼각 그래프  (2) 2023.12.05
[Baekjoon] 12026_BOJ 거리  (1) 2023.12.04
[Baekjoon] 1890_점프  (1) 2023.11.30
[Baekjoon] 1495_기타리스트  (0) 2023.11.29
[Baekjoon] 16194_카드 구매하기 2  (1) 2023.11.28