BOJ_2529_부등호
2021. 9. 8. 01:50ㆍ백준 알고리즘(BOJ)
1
구분: Brute-force
언어: Java
전략:
- 순열을 이용해 부등호에 넣은 숫자 조합을 생성한다.
- 순열이 생성되면 부등호 조건에 맞는지를 확인한다.
- 조건에 맞는 순열을 숫자로 만들어 최대, 최소값을 구한다.
- 출력할 때에는 문자열로 변경한다. - 이때, 0이 생략된 숫자를 문자로 변경할때, 0을 추가한다.
2. 코드
import java.util.Scanner;
public class Main {
static int k; //부등호의 전체 개수
static String[] boo; //부등호를 담을 string배열
static int[] comb, num; //순서를 가진 숫자 조합배열, 0~9까지의 숫자배열
static boolean[] check; //num의 사용여부를 가릴 boolean 배열
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
k = scanner.nextInt();
boo = new String[k];
comb = new int[k+1];
for(int i = 0; i<k; i++) {
boo[i] = scanner.next();
}
num = new int[10];
for(int i = 0; i<10; i++)
num[i] = i;
check = new boolean[10];
perm(0);
//string형태로 출력
System.out.println(Long.toString(max)); //최대값출력
String minstr = Long.toString(min);
if(min / (int)(Math.pow(10, k))==0) {//원래 맨 앞이 0인 경우 - 자릿수가 하나 부족하다 따라서 앞에 0을 붙임
System.out.print("0"+minstr);
}
else
System.out.println(minstr);
}//main
static long max = Long.MIN_VALUE;
static long min = Long.MAX_VALUE;
private static void perm(int cnt) {
if(cnt == k+1) { //원하는 개수 만큼 숫자를 선택했다
//맨처음
int d = comb[0];
boolean isokay = true; //부등호 조건을 만족하는가 확인하는 boolean
for(int i = 0; i<k; i++) {
if(boo[i].equals("<")) { //부등호가 < 인 경우
if(d>comb[i+1]) {//이전것(d)가 더 큰 경우 - 부등호 만족 X
isokay = false;
break;
}
}
else if(boo[i].equals(">")) {// 부등호가 >인 경우
if(d<comb[i+1]) { //부등호를 만족하지 않으면
isokay = false;
break;
}
}
d = comb[i+1];
}
if(!isokay) {
return;
}
//맨 마지막 숫자 확인
if(boo[k-1].equals("<")) { //부등호 <
if(d>comb[k]) //만족하지 않아
isokay = false;
}
else {// 부등호 >
if(d<comb[k]) //만족하지 않아
isokay = false;
}
if(isokay) {// 조건을 만족하는 경우, 최대 최소임을 판정
long number = makenum(comb); // 숫자 배열을 숫자로 변경
max = Math.max(number, max); //최대값 체크
min = Math.min(min, number); //최소값 체크
return;
}
else{
return;
}//해당 순열은 조건을 만족하지 않으므로 그냥 지나가
}
//순열 생성
for(int i = 0; i<10; i++) {
if(check[i]) //이미 사용되었다면 지나가
continue;
comb[cnt] = num[i];
check[i] = true;
perm(cnt+1);
check[i] = false;
}
}//perm
//전체 숫자로 만들어 주기
private static long makenum(int[] arr) {
int n = arr.length;
String str = "";
for(int i = 0; i<n; i++) {
str+=Integer.toString(arr[i]);
}
return Long.parseLong(str);
}
}
3
- 순열을 생성하고, 생성된 것을 이용하는 문제이다.
- 숫자 배열을 하나의 숫자로 변경하는 함수를 만들었는데, 이 함수가 숫자<->문자열을 반복한다. 다른 방법을 찾고 싶다.
- 출력시, 맨 앞에 0이 붙는 경우를 잘 고려해야 한다.
'백준 알고리즘(BOJ)' 카테고리의 다른 글
BOJ_17086_아기 상어2 (0) | 2021.09.15 |
---|---|
BOJ_2644_촌수계산 (0) | 2021.09.15 |
BOJ_16968_차량 번호판1 (0) | 2021.09.07 |
BOJ_7568_덩치 (0) | 2021.09.01 |
BOJ_17070_파이프 옮기기1 (0) | 2021.08.20 |