티스토리 뷰

알고리즘/백준

[BAEKJOON] 15650 N과 M (2)

응애~ 개발자 2022. 10. 9. 13:11
728x90
반응형

문제 요약

  • 알고리즘 분류: 백트래킹
  • 난이도: Silver3
  • 문제내용:
    • N, M 가 주어 졌을때 1 ~ N수 에서 중복없이  M개를 뽑을때
    • 나올수 있는 수를 모두 출력해라.
  • 사이트 주소: https://www.acmicpc.net/problem/15650
 

15649번: N과 M (1)

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

www.acmicpc.net

문제풀이

 이번 문제는 백트레킹 문제이다. 백트레킹 관련 자세한 내용은 아래의 사이트에 참조하면된다.

https://jih3508.tistory.com/84

 

[알고리즘 이론] 백트래킹(Backtracking)

이론 이번에 볼 알고리즘은 백트래킹이다. 백트래킹을 알아두면 대부분 해를 찾는데 도움이 될것이다. 백트레킹은 탐색하는 도중 중복되거나 해를 찾는 방향이 맞지 안 맞으면 그 부분을 탐색

jih3508.tistory.com

https://jih3508.tistory.com/28

 

[BAEJOON] 15649 N과 M (1)

문제 요약 알고리즘 분류: 백트래킹 난이도: Silver3 문제내용: N, M 가 주어 졌을때 1 ~ N수 에서 중복되지 않는 M개를 순서대로 뽑을때 나올수 있는 수를 모두 출력해라. 사이트 주소: https://www.acmicpc

jih3508.tistory.com

 위에 있는 문제랑 비슷한데 이번에는 순열이 아니라 조합이다. 파이썬에는 조합을 구현을 도와주는 combination 함수가 있지만 다른언어는 없어서 백트래킹으로 풀어야 한다,

 N과 M(1) 문제는 숫자가 있는지 없는 지판단해서 추가 했지만 이번문제는 순서대로 나올수있는 수를 구해야 하기 때문에 반복문에 이전에 저장했던 수보다 큰것을 넣으면 되서 중간 조건문이 필요없다. 

  1. N, M을 설정한다.
  2. 파이썬은 값을 담을 리스트만 선언하고 그  외의 언어는 값을 담을 배열로 선언한다.
  3. 0부터 시작해서 M까지 재귀 호출할 함수를 만든다.
  4. M까지 갔을 경우 값을 담은 배열/리스트를 출력한다.
  5. 그 외 경우 이전에 저장했던 숫자보다 큰 수자를 N까지 루프를 돌려서 배열 또는 리스트에 저장한다음 함수 재호출 한다.

CODE

Java

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

public class Main {

	static int N, M;
	static int[] array;
	static StringBuilder sb = new StringBuilder();
	
	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		
		N = sc.nextInt();
		M = sc.nextInt();
		array = new int[M];
		NM(1, 0);
		System.out.println(sb);
		
	}
	
	public static void NM(int k, int depth) {
		if(depth == M) {
			for(int i = 0; i < M; i++) {
				sb.append(array[i] + " ");
			}
			sb.append("\n");
		}else {
			for(int i = k; i <= N; i++) {
				array[depth] = i;
				NM(i + 1, depth + 1);
			}
		}
		
	}
		
}

Python

Backtraking

def NM(k, array):
    if len(array) == M:
        print(' '.join(map(str, array)))
    else:
        for i in range(k, N + 1):
            NM(i + 1, array + [i])

N, M = map(int, input().split())
NM(1, [])

Combinations

from itertools import combinations

N, M = map(int, input().split())
array = list(range(1, N+1))
for item in combinations(array, M):
    print(' '.join(map(str, item)))
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[BAEKJOON] 15651 N과 M (3)  (0) 2022.10.11
[BAEKJOON] 3733 Shares  (0) 2022.10.10
[BAEKJOON] 15649 N과 M (1)  (0) 2022.10.06
[BAEKJOON] 2754 학점계산  (1) 2022.10.05
[BAEKJOON] 2004 조합 0의 개수  (1) 2022.10.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
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
글 보관함