백준 - N과 M (1) 15649번 [6일차]
시간제한 | 메모리 제한 |
1초 | 512MB |
문제
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
설명
나의코드
package day6;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Solution1 {
// N과 M (1) - 15649번
// 1~N까지 중 중복 없이 M개 고른 수열 - 순열 - 백트래킹/ 재귀 사용
// 방문 체크리스트
static boolean [] visit;
//배열
static int [] arr;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringTokenizer st = new StringTokenizer(sc.nextLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
visit = new boolean[N];
arr = new int[M];
// depth의 처음 시작은 0 부터
dfs(N,M,0);
}
static void dfs(int N, int M, int depth){
// 종료 조건 넣어주기 - 무조건 넣어줘야함
if(depth == M){
for (int arrs : arr){
System.out.print(arrs+ " ");
}
System.out.println();
return;
}
for(int i = 0; i < N;i++){
if(!visit[i]){
visit[i] = true; // 해당 depth에서 동일한 번호는 사용하면 안되기 때문에 true로 변경
arr[depth] = i+1;
dfs(N,M,depth+1);
visit[i] = false; // 다른 depth에서 사용해야하기 때문에
}
}
}
}
Scanner와 System.out.println을 for문이 돌때마다 작성되게 코드를 짜서 메모리와 시간이 엄청나게 나왔다
BufferedReader와 StringBuilder를 사용하면 좀더 효율적으로 코드를 바꿀수 있을거 같다
'Algorithm > 코딩테스트' 카테고리의 다른 글
[코딩테스트] 백준 - N과 M (2) (0) | 2024.07.24 |
---|---|
[코딩테스트] 백준 - 알고리즘 수업 - 점근적 표기 1 (0) | 2024.07.24 |
[코딩테스트] 백준 - 인사성 밝은 곰곰이 (0) | 2024.07.22 |
[코딩테스트] 백준 - 숫자카드2 (0) | 2024.07.22 |
[코딩테스트] 백준 - 숫자카드 (0) | 2024.07.22 |