본문 바로가기
Algorithm/백준

15652 N과M (4) (C++)

by IT learning 2021. 4. 25.
728x90

아아 점점 손에 익어가는 듯 싶다.

 

전 문제는 솔직히 찍어서 맞춘감이 없었지만, 이건 정말 "이렇게 하면 어떨까?" 라는 사고를 꺼냈다.

 

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

 

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

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

itlearning.tistory.com

위의 이전문제와 다른점은, 출력하는 숫자가 늘어가며 출력되는 숫자 또한 바뀐다는 것이다. 하나 늘어날 때마다 그 숫자부터 출력할 수 있게 하는 것이다. 이건 생각보다 간단했다. 그냥 진행되는 for문에 변수를 이중 for문에 변수로 사용하여 초기화 하면 되는 것이기 때문이다.

 

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

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

void func(int k) {
    if(k == m) {
		for(int i = 0; i < m; i++) {
			cout << board[i] << ' ';
		}
		cout << endl;
		return;
	}
	
	for(int i = 0; i < n; i++) {
		if(!isused[i+1]) {
			board[k] = i+1;
			//isused[i-1] = 1;
			isused[i] = 1;
			func(k+1);
			for(int j = i ; j < n; j++) {
				isused[j+1] = 0;
			}
		}
	}
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m;
    func(0);
}

 

중간에 이중 for문이 보이는가? 어짜피 이 문제는 isused가 얼마나 잘 초기화 되어있는 지를 물어보는 문제다. 그래서 for문을 돌때 나온 i를 이중 for문의 j에 입력하여 그 숫자 이후에 모든 숫자를 false 로 바꾸면 출력이 가능하다.

 

이게 맞는지는 모르겠다. 그냥 내 머리로 푸는거라.. 일단 풀리면 된거 아니겠는가?

728x90

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

15656 N과M (7) (C++)  (0) 2021.04.26
15654 N과M (5) (C++)  (0) 2021.04.25
15651 N과 M(3) (C++)  (0) 2021.04.25
7562 나이트의 이동 (C++)  (0) 2021.04.25
2583. 영역 구하기 (C++)  (0) 2021.04.23

댓글

IT_learning's Commit