티스토리 뷰
728x90
반응형
Java+Python으로 순열/조합/중복순열/중복조합 구현하기
[Java+Python]15649번, N과 M(1), 순열
[Java+Python]15650번, N과 M(2), 조합
문제
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다.
중복되는 수열을 여러 번 출력하면 안 되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
풀이
전형적인 DFS문제이자, 주어진 숫자로 순열을 만드는 문제이다.
기존에 풀이할 때는 순열, 조합, 중복순열, 중복조합 메서드를 미리 만들어두고
문제에 따라 사용했는데, 다시 푸는 김에 DFS를 이용해서 최대한 간결하게 풀기로 했다.
심지어 파이썬은 순열과 조합을 구하는 함수가 내장되어 있는 것 같기도 하던데..
그런 거 없고 여러 문제에 응용할 수 있게 DFS 구현해 놓기.
먼저 자바 코드이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Prob15649_4 {
static int n;
static int m;
static int[] arr;
static boolean[] isVisited;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
arr = new int[m];
isVisited = new boolean[n + 1];
dfs(0);
System.out.println(sb);
}
private static void dfs(int depth) {
if (depth == m) {
for (int num : arr) {
sb.append(num).append(' ');
}
sb.append('\n');
return;
}
for (int i = 1; i <= n; i++) {
if (!isVisited[i]) {
isVisited[i] = true;
arr[depth] = i;
dfs(depth + 1);
isVisited[i] = false;
}
}
}
}
이어서 파이썬 코드.
파이썬은 순열과 조합을 구하는 함수가 내장되어 있는 것 같지만,
당연히 그렇게 풀라는 문제는 아닌 것 같으니 간결한 DFS로 풀어보았다.
import sys
n, m = map(int, sys.stdin.readline().rstrip().split())
arr = [0] * m
isVisited = [False] * (n + 1)
def dfs(depth):
if depth == m:
for num in arr:
print(num, '', end='')
print()
return
for i in range(1, n + 1):
if isVisited[i] is False:
isVisited[i] = True
arr[depth] = i
dfs(depth + 1)
isVisited[i] = False
dfs(0)
전역변수를 선언하지 않고 풀어보고 싶었지만 도저히 내 머리로는 되지 않는다.
기존에 따로 구현했던 메서드에 비해 확실히 짧아진 느낌!
참고로 시간도 1/4로 줄었다.
반응형
'Algorithm > DFS' 카테고리의 다른 글
[Java+Python]15652번, N과 M(4), 중복조합 (0) | 2023.05.06 |
---|---|
[Java+Python]15651번, N과 M(3), 중복순열 (0) | 2023.05.02 |
[Java+Python]15650번, N과 M(2), 조합 (0) | 2023.04.28 |
[Java]중복 조합(Combination with Repetition) (0) | 2022.08.01 |
[Java]중복 순열(Permutation with repetition), 가위 바위 보 문제 (0) | 2022.08.01 |
[Java]순열(Permutation)과 조합(Combination) (2) | 2022.07.31 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 남미
- 스프링
- BOJ
- 중남미
- 지지
- 세모
- Python
- 여행
- RX100M5
- 파이썬
- 알고리즘
- 맛집
- 리스트
- 칼이사
- 스트림
- 자바
- 기술면접
- Algorithm
- 유럽
- 백준
- 세계여행
- 세계일주
- 야경
- 동적계획법
- 유럽여행
- Backjoon
- java
- spring
- 면접 준비
- a6000
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함