🔺 문제
6603번: 로또
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로
www.acmicpc.net
🔺 코드
- 1) depth가 6일 때, check[i]가 true인 경우에만 출력
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
|
import java.util.*;
import java.io.*;
public class Main {
static int N;
static int[] A;
static boolean[] check;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true) {
String str = br.readLine();
if(str.equals("0")) {
System.out.println(sb);
break;
}
// 초기값 세팅
String[] input = str.split(" ");
N = Integer.parseInt(input[0]);
A = new int[N];
check = new boolean[N];
for(int i = 0 ; i < N ; i++) {
A[i] = Integer.parseInt(input[i + 1]);
}
back(0, 0);
sb.append("\n");
}
}
private static void back(int startIdx, int depth) {
if(depth == 6) {
for(int i = 0 ; i < N ; i++) {
if(check[i]) { // 🔔 check 배열의 값이 true인 값만 출력
sb.append(A[i]).append(" ");
}
}
sb.append("\n");
}
for(int i = startIdx ; i < N ; i++) {
check[i] = true;
back(i + 1 , depth + 1); // 본인 제외하고 다음 수로 넘어가게 i + 1
check[i] = false;
}
}
}
|
cs |
- 2) 결과 배열 result를 따로 만들어서 출력에 이용
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
|
import java.util.*;
import java.io.*;
public class Main {
static int N;
static int[] A, result;
static boolean[] check;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true) {
String str = br.readLine();
if(str.equals("0")) {
System.out.println(sb);
break;
}
// 초기값 세팅
String[] input = str.split(" ");
N = Integer.parseInt(input[0]);
A = new int[N];
result = new int[N];
check = new boolean[N];
for(int i = 0 ; i < N ; i++) {
A[i] = Integer.parseInt(input[i + 1]);
}
back(0, 0);
sb.append("\n");
}
}
private static void back(int startIdx, int depth) {
if(depth == 6) {
for(int i = 0 ; i < 6 ; i++) sb.append(result[i]).append(" ");
sb.append("\n");
}
for(int i = startIdx ; i < N ; i++) {
if(!check[i]) {
result[depth] = A[i]; // 결과 배열 갱신
check[i] = true;
back(i, depth + 1);
check[i] = false;
}
}
}
}
|
cs |
✅ 해결 아이디어
✔ 백트래킹
- 종료 조건 : depth가 6일 때 결과 배열 출력
- 종료 조건 아닌 반복문
└ check 배열 사용 ; 중복된 수가 들어오지 못 하도록
└ startIdx부터 시작 ; 순열 아닌 조합!
💬 느낀 점
감이 잡힌 거 같은데
한 끗 차이로(?) 자꾸 정답을 비껴나가고... 그랬다...
한 줄 한 줄 왜 필요한지 생각하면서 잘 작성해보좌,,,
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
[알고리즘] 백준 6603번 로또 Java
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.*; public class Main { static int k; static int [] s; static boolean [] chk; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(
roomconerdeveloper.tistory.com
[백준] 6603번 로또 - Java, 자바
실버 2https://www.acmicpc.net/problem/6603백트래킹 주어진 수에서 6개의 수를 골라야한다. 단, 여기서 숫자는 중복될 수 없고 순열이 아닌 조합이다. (로또의 순서가 의미가 없다)백트래킹을 수행한다. 1)
velog.io
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 11931번: 수 정렬하기 4 (0) | 2023.08.29 |
---|---|
[백준/JAVA] 10974번: 모든 순열 (0) | 2023.08.27 |
[백준/JAVA] 15657번: N과 M (8) (0) | 2023.08.25 |
[백준/JAVA] 10971번: 외판원 순회 2 (0) | 2023.08.24 |
[백준/JAVA] 14889번: 스타트와 링크 (0) | 2023.08.24 |