본문 바로가기
Algorithm/백준

15656 N과M (7) (C++)

by IT learning 2021. 4. 26.
728x90

N과 M 시리즈 문제가 생각보다 재밌다. (뭐 잘 풀려서 그런거지..이러다가 안풀리면 재미없다고 한다 또)

 

아무튼. 이 문제는 

itlearning.tistory.com/entry/15651-N%EA%B3%BC-M3-C

 

15651 N과 M(3) (C++)

음... 일단 내가 생각한건 이거다... 기존의 백트래킹은, 그냥 한번 올라가거나, 뿌리 내려지기 전의 수부터 시작을 하지 않는다고 생각했다. 그래서 아얘 그냥 위부터 쭈우우우욱 올라가서 다시

itlearning.tistory.com

이 문제와 똑같다. 단지 수열을 내가 입력하는 것이 추가된 것 뿐.

 

그래서 이 문제의 답을 참고해서 코드를 작성했다.

 

문제의 해결법은 이렇다. 원하는 수열을 입력받고, 입력받은 수열을 배열에 저장한 뒤, 출력하는 수열을 따로 만들어서 복사시키고 출력하면 된다!

 

그리고 1부터 출력시키고 싶다면 모든 isused[]배열을 false로 초기화 시키고 출력하면 된다.

 

이해가 안간다면

itlearning.tistory.com/entry/15654-N%EA%B3%BCM-5-C

 

15654 N과M (5) (C++)

아 점점 손에 익어간다 진짜로... 어떻게 구동 되는지 보인다.. 거두절미하고. 이 문제는 기존에 입력이 N개의 자연수 중에서 M개의 수열을 출력하는 것이었다면, 이건 수열을 직접 골라서 출력해

itlearning.tistory.com

이 글을 확인하면 이해에 도움이 될듯 싶다.

 

코드를 보자!

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'

int n,m;
int board[10];
int arr[10];
int isused[10];

void func(int k) {
    if(k == m) {
		 for(int i = 0; i < m; i++) {
            cout << arr[i] << ' ';
        }
        cout << endl;
        return; // 리턴을 해서 바로 윗 단계로 올라감
	}
	
	for(int i = 0; i < n; i++) {
        if(!isused[i]) { // 아직 사용되지 않은 경우
            arr[k] = board[i];
            isused[i+1] = 1;
            func(k+1);
			for(int i = 0; i < n; i++) {
				isused[i] = 0;
			}
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m;
	
	for(int i = 0; i < n; i++) {
		cin >> board[i];
	}
	sort(board,board+n);
    func(0);
	
}

 ㄷ for문을 보면 arr에 우리가 입력한 수열을 입력시키고, 방문했다고 isused를 1(true)로 바꾼다.

 

그리고 재귀를 돌고, 이중 for문에서 isused를 전부 초기화 시킨다. 그렇게 되면 다시 처음 숫자부터 출력이 된다.

728x90

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

15683 감시 (C++)  (0) 2021.05.01
6593 상범 빌딩 (C++)  (0) 2021.04.28
15654 N과M (5) (C++)  (0) 2021.04.25
15652 N과M (4) (C++)  (0) 2021.04.25
15651 N과 M(3) (C++)  (0) 2021.04.25

댓글

IT_learning's Commit