코테/백준

[백준/JAVA] 15650번: N과 M (2)

imname1am 2023. 6. 5. 17:31
반응형

🔺 문제

 

15650번: N과 M (2)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

 

 

 

🔺 코드

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
import java.util.*;
import java.io.*;
 
public class Main {
    static int N, M;
    static int[] A;
    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());
        
        A = new int[M];
        
        dfs(10);
        System.out.println(sb);
    }
    
    public static void dfs(int at, int depth) { // at : 현재 위치
        if(depth == M) {
            for(int val : A) {
                System.out.print(val +" ");
            }
            System.out.println();
            return;
        }
        
        for(int i = at ; i <= N ; i++) {    // 🔔 at부터 탐색 시작
            A[depth] = i;                   // 현재 깊이 위치에 i값 담기
            dfs(i + 1, depth + 1);          // (🔔재귀) 오름차순 탐색 위해 i + 1을 증가시킨 값 인자로 넘기기 
        }
    }
}
cs
✅ 해결 아이디어
✔ 백트래킹 (재귀) : 수열 사전 순 증가
- 고른 수열이 오름차순이어야 함.
→ dfs 함수 인자로 i + 1을 넘겨줘서 for문을 돌 때 시작하는 start 값 증가시키기

 

 


💬 느낀 점

종료 조건만 어떻게 바꿔주면 되지 않을까..

조건식만 잘 추가해주면 쉽게 풀 수 있지 않을까.. 해놓고 헤맸당ㅠ

 

 

1회독 2회독 3회독 4회독 5회독
V 8.23      

 

 

(+ 2회독 : 8.23)

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
import java.util.*;
import java.io.*;
 
public class Main {
    static int N, M;
    static int[] A;
    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());
        
        A = new int[M];
        
        dfs(10);
        System.out.println(sb);
    }
    
    private static void dfs(int tmp, int depth) {    // tmp : 현재 숫자
        if(depth == M) {
            for(int i : A)  sb.append(i).append(" ");
            sb.append("\n");
            return;
        }
        
        for(int i = tmp ; i <= N ; i++) {    // 👊 tmp부터 탐색 시작 👊
            A[depth] = i;                    // 현재 위치에 i 담음
            dfs(i + 1, depth + 1);          // 🔔 재귀 ; 오름차순 탐색 위해 i + 1 증가시킨 값을 인자로 전달
        }
    }
}
cs

 


(참고)

✔ 항상 감사드리는 주인장님,,,

 

[백준] 15650번 : N과 M (2) - JAVA [자바]

www.acmicpc.net/problem/15650 15650번: N과 M (2) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열

st-lab.tistory.com

 

[ 백준 15650 / Java ] N과 M (2)

https://www.acmicpc.net/problem/15650 15650번: N과 M (2) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

codesign.tistory.com

 

반응형