보글보글 개발일지
Published 2023. 3. 14. 16:49
[백준/15650][Java] N과 M(2) 알고리즘
반응형

문제

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

 

15650번: N과 M (2)

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

www.acmicpc.net

설명

N과 M(1)이 백트래킹을 이용한 순열 문제라면 N과 M(2)는 백트래킹을 이용한 조합 문제이다.

조합은 순서가 상관없다. 또한 오름차순으로 구하게되면 이전에 했던 문제와 달리 중복 체크가 필요 없다.

처음에 combination(0,1)을 호출하는데, 이후에는 combination(cnt+1, i+1)을 호출한다.
오름차순으로 구하면 중복체크 하지 않아도 되므로, visited 배열을 따로 사용하지 않았다.
cnt+1은 다음 자릿수 결정한다는 의미이고, i+1은 오름차순이므로 앞자리 숫자보다 무조건 커야함을 의미한다.

코드

package algo0314;

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

public class B15650_N과M2 {
    private static int n, m;
    private static int[] arr; // 원소를 저장할 배열
    private static boolean[] visited; // 중복을 제거하기 위한 방문 처리
    static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		
		arr = new int[m];
		combination(0,1); //글자 몇개 선택, 시작숫자 번호
		System.out.println(sb);
	}
	private static void combination(int cnt, int start) {
		// TODO Auto-generated method stub
		if(cnt == m) { //m개를 다 골랐으면
			for(int i=0;i<m;i++) {
				sb.append(arr[i]).append(" ");
			}
			sb.append("\n");
			return;
		}
		else {
			for(int i=start;i<=n;i++) {
				arr[cnt] = i;//cnt번째에 i 저장. i는 start부터 n까지 들어감
				combination(cnt+1, i+1);//오름차순으로 구하면 중복체크 하지 않아도 됨
				//cnt+1은 다음 자릿수 결정한다는 의미
				//i+1은 오름차순이므로 앞자리 숫자보다 무조건 1이상 커야함을 의미
			}
		}
	}

}
반응형

'알고리즘' 카테고리의 다른 글

[백준/1931][Java] 회의실 배정  (0) 2023.03.17
[백준/11724][Java] 연결요소의 개수  (0) 2023.03.16
[백준/15649][Java] N과 M(1)  (0) 2023.03.14
[백준/9742][Java] 순열  (0) 2023.03.14
[백준/12891][Java] DNA 비밀번호  (0) 2023.03.11
profile

보글보글 개발일지

@보글

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!