Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 스프링
- Spring
- Baekjoon
- 그리디
- 개발
- 그리디알고리즘
- 애자일기법
- 백준
- 애자일프로그래밍
- Java
- 코딩
- ES
- 클린코드
- 읽기쉬운코드
- spring boot
- 엘라스틱서치
- 데이터베이스
- 알고리즘
- framework
- 애자일
- database
- API
- 프레임워크
- 개발자
- cleancode
- Elasticsearch
- 코드
- 자바
- JPA
- 코딩테스트
Archives
- Today
- Total
튼튼발자 개발 성장기🏋️
[2529번] 부등호 본문
반응형
문제 기출 : [https://www.acmicpc.net/problem/2529]
풀이 방법
[백트래킹 : backTracking] 접근
가장 먼저 default 값을 만들자. 최대값의 경우에는 9부터 -1씩 해가면서 채워주고, 최소값의 경우에는 -부터 _1씩 해가면서 채워준다.
이제부터 backTracking 기법을 사용하여 부등호를 만족하는지 체크한다. 부등호를 읽어올 필요없이 그냥 javascript engine을 사용해서 boolean 값을 받기만 하면 된다. 부등호가 만족하지 않는다면 앞의 숫자와 자리를 바꿔준다. 왜냐하면 최대값과 최소값을 구해야하기 때문이다.
이런식으로 체크를 끝까지 하게 되었을 때 나온 값이 바로 최대값 최소값이 될 수 있다.
단 한 번의 backTracking으로 최대값과 최소값을 구할 수도 있을 것 같은데... 좋은 방법이 떠오르지 않는다...ㅠ |
문제 풀이
public class Main {
public final static ScriptEngineManager MNG = new ScriptEngineManager();
public final static ScriptEngine ENGIN = MNG.getEngineByName("js");
public static void backTracking(char[] input) throws ScriptException {
String expression = "";
int frontIndex = 0;
int hindIndex = 0;
char temp = ' ';
String ans = "";
for (int i = input.length-1; i >= 0; i-=2) {
if(i == 0) {
System.out.println(ans);
return;
}
frontIndex = i-2;
hindIndex = i;
for (int j = i-2; j < i+1; j++) {
expression = expression.concat(String.valueOf(input[j]));
}
if(false == Boolean.valueOf(String.valueOf(ENGIN.eval(expression)))) {
temp = input[frontIndex];
input[frontIndex] = input[hindIndex];
input[hindIndex] = temp;
backTracking(input);
return;
} else {
ans = "";
for (int k = 0; k < input.length; k+=2) {
ans = ans.concat(String.valueOf(input[k]));
}
}
expression = "";
}
}
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int answer = 0;
try {
int N = Integer.parseInt(br.readLine());
int i = -1;
int j = 10;
char[] maxInput = new char[(2 * N) + 1];
char[] minInput = new char[(2 * N) + 1];
StringTokenizer tokens = new StringTokenizer(br.readLine(), " ");
while (tokens.hasMoreTokens()) {
i++;
if(i%2 == 1) {
char getInput = tokens.nextToken().charAt(0);
maxInput[i] = getInput;
minInput[i] = getInput;
} else {
j--;
maxInput[i] = Character.forDigit(j, 10);
minInput[i] = Character.forDigit(9-j, 10);
}
}
maxInput[maxInput.length-1] = Character.forDigit(j-1, 10);
minInput[minInput.length-1] = Character.forDigit(9-(j-1), 10);
backTracking(maxInput);
backTracking(minInput);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
반응형
'Business logic > 백준' 카테고리의 다른 글
[1543번] 문서검색 (0) | 2020.04.19 |
---|---|
[2437번] 저울 (0) | 2020.04.19 |
[2352번] 반도체 설계 (0) | 2020.04.15 |
[2217번] 로프 (0) | 2020.04.15 |
[1946번] 신입 사원 (0) | 2020.04.14 |