티스토리 뷰
https://www.acmicpc.net/problem/2529
2529번: 부등호
두 종류의 부등호 기호 ‘<’와 ‘>’가 k개 나열된 순서열 A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제시
www.acmicpc.net
💡 순열 코드를 작성할 수 있는지가 가장 중요!
문제 해결 과정
1. 순열을 통해 k+1개의 수 조합
2. 순열을 만들면서 부등호 판별(checkSign)하여 가지치기
3. 기저 조건에 도달하면 만들어진 수를 문자열로 만들어 list에 저장
시행착오
1. int형 min, max에 최소, 최댓값을 저장했으나 int 범위를 초과하는 결과값이 있었다.
-> long으로 변경
2. 문제의 출력 조건이다.
여러분은 제시된 부등호 관계를 만족하는 k+1 자리의 최대, 최소 정수를 첫째 줄과 둘째 줄에 각각 출력해야 한다. 단 아래 예(1)과 같이 첫 자리가 0인 경우도 정수에 포함되어야 한다. 모든 입력에 답은 항상 존재하며 출력 정수는 하나의 문자열이 되도록 해야 한다.
사실 처음에는 정수형 min이 1,000,000,000 보다 작으면 출력할 StringBuilder에 "0"+min을 넣어 출력값을 보정해줬다. 자꾸 틀린 이유였다. 출력 정수는 하나의 문자열이여야 한다는 조건이 있었고 간과했다.
-> ArrayList에 부등호를 만족하는 모든 결과값을 문자열로 만들어 저장했다. 그 후 리스트를 정렬하여 첫번째(최댓값)과 마지막(최솟값)을 출력했다.
|
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
static int k;
static char[] signs;
static int[] src = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
static int[] tgt;
static boolean[] isSelected = new boolean[src.length];
static ArrayList<String> ans = new ArrayList<>();
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
k = Integer.parseInt(br.readLine());
signs = new char[k];
tgt = new int[k+1];
// input sign of inequalities
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<k; i++) signs[i] = st.nextToken().charAt(0);
// permutation
perm(0);
// sort & print
Collections.sort(ans);
StringBuilder sb = new StringBuilder(ans.get(ans.size()-1)+"\n"+ans.get(0));
System.out.println(sb);
}
static void perm(int idx) {
// 기저조건
if(idx == tgt.length) {
ans.add(makeNum());
return;
}
for(int i=0; i<src.length; i++) {
if(isSelected[i]) continue;
// 부등호 판별
if(idx>0 && !checkSign(idx, src[i])) continue;
isSelected[i] = true;
tgt[idx] = src[i];
perm(idx+1);
isSelected[i] = false;
}
}
static boolean checkSign(int idx, int num) {
if(signs[idx-1]=='<') return tgt[idx-1] < num;
else return tgt[idx-1] > num;
}
static String makeNum() {
StringBuilder tmp = new StringBuilder();
for(int i=0; i<tgt.length; i++) {
tmp.append(tgt[i]);
}
return tmp.toString();
}
}
|
cs |
'알고리즘 > 백준' 카테고리의 다른 글
| [JAVA] 백준 15686 치킨배달 (0) | 2022.01.05 |
|---|---|
| [JAVA] 백준 11729번 (0) | 2021.12.16 |
| [JAVA] 백준 11659번 (0) | 2021.12.13 |
| [JAVA] 백준 17471번 (0) | 2021.03.24 |
| [JAVA] 백준 14891번 (0) | 2021.03.16 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 프로그래머스
- BFS
- recursion
- 하노이 탑
- Stack
- 15686
- CS
- 와일드카드
- 2529
- 순열
- 알고리즘
- 11659
- Regex
- Wrapper Class
- 제네릭
- 백트래킹
- java
- generic
- 11729
- OOP
- 조합
- 디자인 패턴
- 구간 합 구하기
- gof
- 재귀
- 백준
- 신규아이디추천
- 4796
- 래퍼 클래스
- 게리맨더링
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함