https://www.acmicpc.net/problem/6603
6603번: 로또
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로
www.acmicpc.net
코드설명
백트래킹 문제입니다.
문제로직입니다.
- 주어진 집합 S를 모두 입력받습니다.
- 집합 S중에서 6가지만 뽑으면 되므로, level == 6 일때 중단시키도록 처리합니다.
- 이때, level이 올라가는 과정에 idx를 활용하여 해당 자리에서 선택된 수열의 원소 뒤의 원소들만 넣을 수 있도록 처리하여 오름차순으로 정렬하고, 반복된 숫자를 넣지 않도록 설정했습니다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.StringTokenizer; public class Main { public static int k, S; public static int answer = 0; public static int[] arr; public static boolean[] visited; public static int[] answerArr; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); answerArr = new int[6]; while(true) { StringTokenizer st = new StringTokenizer(br.readLine()); k = Integer.parseInt(st.nextToken()); if(k == 0) break; arr = new int[k]; visited = new boolean[k]; for(int i=0;i<k;i++) { arr[i] = Integer.parseInt(st.nextToken()); } simulate(0, 0); System.out.println(); } } public static void simulate(int idx, int level) { if(level == 6) { for(int i=0;i<6;i++) { System.out.print(answerArr[i]+" "); } System.out.println(); return ; } for(int i=idx;i<k;i++) { if(visited[i] == false) { visited[i] = true; answerArr[level] = arr[i]; simulate(i+1, level + 1); visited[i] = false; } } } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 15658 연산자 끼워넣기 (2) - 브루트포스(재귀) JAVA (0) | 2023.09.08 |
---|---|
[백준] 14225 부분수열의 합 - 브루트포스(재귀) JAVA (0) | 2023.09.07 |
[백준] 1339 단어 수학 - 백트래킹 + 그리디 JAVA (0) | 2023.09.07 |
[백준] 2529 부등호 - 브루트포스 + 구현 JAVA (0) | 2023.09.07 |
[백준] 1080 행렬 - 그리디(탐욕법, Greedy) + 구현 + 비트마스크(BitMask) JAVA (0) | 2023.09.06 |