• Home
  • About
    • Ryureka Moment photo

      Ryureka

      Sin Prisa, Sin Pausa

    • About Me
    • Facebook
    • Github
    • Youtube
  • Projects
  • Posts
    • Posts
    • ProblemSolvings
    • Tags
    • Blog
    • Examples
  • ProblemSolving
    • ProblemSolving
    • BOJ
    • Programmers
    • SWEA
    • LeetCode
  • FrontEnd
    • FrontEnd
    • HTML
  • BackEnd
    • BackEnd
    • Server
      • Server
      • Spring
      • NodeJS
    • DataBase
      • DataBase
      • MySQL
      • MongoDB
  • Programming
    • Programming
    • Java
    • JS
    • Python
    • CleanCode
  • ComputerScience
    • DataStructure
    • Algorithm

[BOJ] 15650. N과 M(2)

15 Apr 2026

Reading time ~1 minute

  • 풀이

풀이

import java.util.Scanner;

public class Main {
	static int a[]= new int [8]; // 1<=M<=N<=8이 이므로 최대 8자리 필요
								 // 위치가 인덱스가 되고 인덱스는 0부터 시작된다고 하자!
	static boolean c[]=new boolean[9];  // 중복을 체크하기 위한 배열
										// 0은 무시하기 위해 +1만큼
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int N=sc.nextInt();
		int M=sc.nextInt();
		go(0,N,M,1); // 0번째 위치 부터 숫자 채울 예정이므로
	}
	
	public static void go(int index,int N, int M,int start) {
		if(index==M) {// 위치(인덱스)가 0부터 M-1까지 M개를 채웠으므로 마지막 순간은 M-1에서 M번째 위치로 넘어갈 때이므로 
			for (int i = 0; i < M; i++) { // 위치(인덱스)가 0부터 M-1까지 M개를 채웠으므로 그 위치까지 출력
				System.out.print(a[i]+" ");
			}
			System.out.printf("\n"); // 한 싸이클의 숫자를 택하여 출력하였으므로 개행
			return ; // 출력 했으니 함수 호출 끝냄.
		}
		for(int i=start;i<=N;i++) {
			if(c[i]) continue; // 사용한 숫자면 넘어가라(중복불가이므로)
			a[index]=i; // 숫자를 차례로 채우다가 index번째 위치에 채울 수로는 사용되지 않은 변수 i가 오면 됌.
			c[i]=true; // index번째 위치에 숫자 i를 채웠으므로 숫자 i를 사용했다라고 처리해줌.
			go(index+1,N,M,i+1); // 다음 위치 숫자를 현재 위치에서 선택한 i보다 큰 값으로 채워줘!
			c[i]=false; // 재귀 함수 호출이 끝나면 함수는 끝난거니까 false로 바꿔주면 됨.
		}
	}
}


백트래킹조합 Share