BOJ15663

백준 15663: N과 M(9)

Link: https://www.acmicpc.net/problem/15663

풀이

  • 백 트래킹 문제
  • 기본적으로 dfs를 이용
    • 답안 배열에 값을 저장해 나감
    • 저장된 답이 M개이면 기록 후 종료
    • 탐색 단계에서 백트래킹
      • 같은 깊이의 dfs에서 이전에 배열에 추가된 값과 같은 값으로 탐색하면 중복 발생
      • 이전에 저장된 값을 기억하여 중복 방지 (before 변수 사용!)
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;

public class Main {
	static int N;
	static int M;
	static int[] nums;
	static ArrayList<String> arr = new ArrayList<>();
	static boolean[] v;
	static int[] ans;
	static StringBuilder sb = new StringBuilder();
	
	public static void main(String[] args) throws Exception {
		//System.setIn(new FileInputStream("C:\\Users\\JH\\git\\Algorithm\\Baekjoon\\src\\input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] s = br.readLine().split(" ");
		N = Integer.parseInt(s[0]);
		M = Integer.parseInt(s[1]);
		nums = new int[N];
		
		s = br.readLine().split(" ");
		//숫자 입력
		for(int i = 0;i<N;i++) {
			nums[i] = Integer.parseInt(s[i]);
		}
		//사전순 정렬을 위해 숫자 배열 먼저 정렬
		Arrays.sort(nums);
		
		//답을 저장할 배열 및 방문배열 초기화
		ans = new int[M];
		v = new boolean[N];
		//dfs(백트래킹)
		dfs(0);
		System.out.println(sb);
	}
	
	static void dfs(int cnt) {
		
		//M개를 골랐으면 답 배열 StringBuilder에 Append
		if(cnt==M) {
			for(int n : ans) {
				sb.append(n).append(" ");
			}
			sb.append("\n");
			return;
		}
		
		//이전에 추가된 값이랑 같은 값이 추가되면 중복 탐색이 일어나므로 이전 추가된 값을 저장할 before 추가
		int before = 0;
		
		for(int i = 0;i<N;i++) {
			//방문하지 않았고 바로 이전에 추가된 값이 아니라면 탐색
			if(!v[i]&&before!=nums[i]) {
				v[i] = true;
				ans[cnt] = nums[i];
				//이전에 추가된 값 갱신
				before = nums[i];
				dfs(cnt+1);
				v[i] = false;
				
			}
		}
	}
}

Issue

  • 백 트래킹을 구현하는 데에서 헤멤
  • 검색 후 알아냈음. 역시 개발자는 구글링

Leave a comment