백준

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

lucy1215 2023. 1. 1. 22:59
728x90
반응형

앞에서 15649번 : N과 M (1)을 풀고 바로 다음 문제인 15650번 : N과 M (2)을 풀었다.

 

백트래킹에 대해 아직 이해하지 못했다면 다음의 블로그에서 확인하면 된다.

https://lucy1215.tistory.com/3

 

알고리즘 - 백트래킹(Backtracking)

DFS와 백트래킹 깊이 우선 탐색(DFS) DFS는 가능한 모든 경로(후보)를 탐색한다. 장점 : 무한히 깊은 곳을 찾아야할때 효과적이다. 단점 : 모든 곳을 방문하기 때문에 굳이 목표지점이 있지 않는 경

lucy1215.tistory.com

 

바로 앞 문제인 15649번 : N과 M (1)에 대한 내용은 바로 앞의 블로그에서 확인하면 된다.

https://lucy1215.tistory.com/4

 

[백준] 15649번 : N과 M (1) (JAVA)

앞에서 백트래킹을 공부한 다음 백준 백트래킹 관련 문제인 15649번 : N과 M (1) 을 풀었다. 백트래킹에 대해 아직 이해하지 못했다면 바로 앞의 블로그에서 확인하면 된다. https://lucy1215.tistory.com/3

lucy1215.tistory.com


<문제>

 

<문제 해석>

백트래킹을 이용하여 1부터 N까지 중복 없이 M개의 수를 고른 오름차순 수열을 출력하라.

 

 

<문제 해결>

앞의 문제인 N과 M (1)과 비슷한 문제이다.

다만, 앞의 문제와 "오름차순" 이라는 조건이 추가가 되었다.

오름차순을 해결하기 위해서는 현재위치를 나타내기 위해 location이라는 변수도 추가해주었다.

 

1. n과 m을 입력받는다.

 

2. 탐색과정에서 값을 담을 int 배열 생성 : ar

 

3. 백트래킹 함수

 

 - index가 마지막 위치에 도달하면 수열을 출력하도록 한다.

 - for 문을 이용하여 수열 생성 (초기값 : location)

 

                   ar의 index위치에 i 넣고,

                                     ↓

      location값 1씩 증가, index값 1씩 증가하면서 재귀 진행

 

 

<코드>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

class Main{
	static int n,m;
	static int a[];
	static StringBuilder sb = new StringBuilder();
	
    public static void main(String[] args) throws NumberFormatException, 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];
    	
    	backtracking(1,0);
    	System.out.println(sb);
    
    	
    }
    
    public static void backtracking(int location, int index) {
    	if(index == m) {
    		for(int i=0;i<m;i++) {
    			sb.append(a[i]).append(" ");
    		}
    		sb.append('\n');
    		return;
    	}
    	
    	for(int i=location;i<=n;i++) {
    		a[index] = i;
    		backtracking(i+1,index+1);
    	}
    }
    

}

 

 


https://www.acmicpc.net/problem/15650

 

15650번: N과 M (2)

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

www.acmicpc.net

 

반응형

'백준' 카테고리의 다른 글

[백준] 2580번 : 스도쿠 (JAVA)  (0) 2023.01.03
[백준] 9663번 : N-Queen (JAVA)  (0) 2023.01.03
[백준] 15652번 : N과 M (4) (JAVA)  (0) 2023.01.01
[백준] 15651번 : N과 M (3) (JAVA)  (0) 2023.01.01
[백준] 15649번 : N과 M (1) (JAVA)  (0) 2023.01.01