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
- DBASE&
- 프로그래머스
- DFS
- oracle ansi
- 프로그래머스 이중우선순위큐 java
- JPA
- 이분탐색
- 이중우선순위큐 java
- 프로그래머스 이중우선순위큐
- 백트래킹
- 면접 필수 질문
- IT 면접 준비
- 이중우선순위큐 자바
- 개발자 면접 준비
- Spring Boot
- ansi sql 단점
- 위상정렬
- SQL
- 그리디
- CJ DBASE&
- ansi sql 장점
- 디베이스앤
- 백준
- oracle ansi sql
- 프로그래머스 이중우선순위큐 자바
- BFS
- Gradle
- 디베이스앤 인턴 후기
- Java
- DP
Archives
- Today
- Total
쉬운 프로그래밍
[알고리즘] 백준 6603 로또 본문
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_6603 {
static int k;
static int[] map;
static boolean[] visited;
static int[] arr;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String s = br.readLine();
int k = (s.charAt(0)) - '0';
if (k == 0) {
break;
}
StringTokenizer st = new StringTokenizer(s, " ");
int len = Integer.parseInt(st.nextToken());
map = new int[len];
visited = new boolean[len];
arr = new int[6];
for (int i = 0; i < map.length; i++) {
map[i] = Integer.parseInt(st.nextToken());
}
backTracking(0);
System.out.println(sb);
sb.delete(0,sb.capacity());
}
}
static void backTracking(int depth) {
if (depth == 6) {
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]).append(' ');
}
sb.append('\n');
return;
}
for (int i = 0; i < map.length; i++) {
if (!visited[i]) {
if (depth == 0 || arr[depth - 1] <= map[i]) {
visited[i] = true;
arr[depth] = map[i];
backTracking(depth + 1);
visited[i] = false;
}
}
}
}
}
N과 M과 유사한 백트래킹 문제다.
입력으로 주어진 정수 배열에서 6개를 뽑아 백트래킹을 돌리면 된다.
그러므로 depth가 6이 찍히면 StringBuilder에 넣어서 출력하고,
오름차순으로 정렬된 값만 선택해야 하므로 arr[depth - 1] <= map[i]인 경우만 포함하여 백트래킹을 돌린다.
static void backTracking(int depth, int index) {
if (depth == 6) {
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]).append(' ');
}
sb.append('\n');
return;
}
for (int i = index; i < map.length; i++) {
if (!visited[i]) {
visited[i] = true;
arr[depth] = map[i];
backTracking(depth + 1, i);
visited[i] = false;
}
}
}
얘는 저기서 최적화 한거다. 한 10ms정도로 발라진다.
메소드의 파라미터를 1개 더 늘려서 반복문을 현재 index값부터 돌려서 오름차순을 만드는건데,
입력 배열이 정렬되어있을때만 가능하다. 이렇게 할 수도 있다고 알아두자~
'알고리즘 > 백트래킹' 카테고리의 다른 글
[알고리즘] 백준 2580 스도쿠 - JAVA (0) | 2021.02.04 |
---|---|
[알고리즘] 백준 9663 N-Queen (8) | 2021.01.10 |
[알고리즘] 백준 15652 N과 M (4) (0) | 2021.01.07 |
[알고리즘] 백준 15650 N과 M (2) (0) | 2021.01.06 |
[알고리즘] 백준 15649 N과 M (1) (0) | 2021.01.06 |
Comments