https://www.acmicpc.net/problem/6603
6603번: 로또
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로
www.acmicpc.net
문제
독일 로또는 {1, 2, ..., 49}에서 수 6개를 고른다.
로또 번호를 선택하는데 사용되는 가장 유명한 전략은 49가지 수 중 k(k>6)개의 수를 골라 집합 S를 만든 다음 그 수만 가지고 번호를 선택하는 것이다.
예를 들어, k=8, S={1,2,3,5,8,13,21,34}인 경우 이 집합 S에서 수를 고를 수 있는 경우의 수는 총 28가지이다. ([1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34], [1,2,3,5,13,21], ..., [3,5,8,13,21,34])
집합 S와 k가 주어졌을 때, 수를 고르는 모든 방법을 구하는 프로그램을 작성하시오.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로 주어진다.
입력의 마지막 줄에는 0이 하나 주어진다.
출력
각 테스트 케이스마다 수를 고르는 모든 방법을 출력한다. 이때, 사전 순으로 출력한다.
각 테스트 케이스 사이에는 빈 줄을 하나 출력한다.
해설
전에 풀었었던 N과 M(5) 문제와 같은 유형의 문제라고 볼 수 있다.
https://jjunsu.tistory.com/119
[백준/BOJ] 15654번: N과 M(5)
https://www.acmicpc.net/problem/15654 15654번: N과 M (5) N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수
jjunsu.tistory.com
모든 로또 번호를 찾는데, 이를 오름차순으로 출력을 해야 한다.
DFS를 이용하여 이미 방문했던 수인지를 확인해보고 방문을 안했었더라면 saveNum 배열에 수를 저장해주고, 방문을 했더라면 그냥 지나치면 된다.
또한 오름차순 순으로 가야 되므로 2 1 3 4 5 6과 같은 배열은 나올 수 없다.
따라서 DFS를 할 때 배열의 반복을 할 때 시작 위치를 매개 변수로 넣어주어야 한다.
배열의 길이가 6이 되었다면 saveNum에 있는 수들을 출력해주면 되는 간단한 문제이다.
소스 코드
import java.lang.StringBuilder
import java.util.*
fun main() = with(System.`in`.bufferedReader()) {
while(true) {
val sb = StringBuilder()
val st = StringTokenizer(readLine())
val n = st.nextToken().toInt()
if(n == 0) break
val arr = IntArray(n)
for(i in 0 until n) arr[i] = st.nextToken().toInt()
val saveNum = IntArray(6)
val visited = BooleanArray(n)
fun dfs(idx: Int, start: Int) {
if(idx == 6) {
saveNum.forEach { i -> sb.append("$i ") }
sb.append("\n")
return
}
for(i in start until n) {
if(!visited[i]) {
visited[i] = true
saveNum[idx] = arr[i]
dfs(idx+1, i)
visited[i] = false
}
}
}
dfs(0, 0)
println(sb.toString())
}
}
'PS(Problem Solving) > BOJ' 카테고리의 다른 글
[백준/BOJ] 11722번: 가장 긴 감소하는 부분 수열 (0) | 2022.03.28 |
---|---|
[백준/BOJ]1927번: 최소 힙 (0) | 2022.03.27 |
[백준/BOJ] 1912번: 연속합 (0) | 2022.03.26 |
[백준/BOJ] 1788번: 피보나치 수의 확장 (0) | 2022.03.26 |
[백준/BOJ] 12847번: 꿀 아르바이트 (0) | 2022.03.06 |
댓글