본문 바로가기
알고리즘/완전 탐색

백준 1074번 : Z

by Jason95 2020. 12. 17.

문제 링크 : www.acmicpc.net/problem/1074

풀이에 참고한 링크 : www.acmicpc.net/board/view/46542

내 풀이 (2020.12.17.) :

#include <iostream>
#include <cmath>

using namespace std;

int N, R, C;
int cnt = 0;

void search(int N, int r, int c) {
	if (N == 0) {
		if(R == r && C == c){
			cout << cnt;
		}
		cnt++;
		return;
	}

	int n = pow(2, N - 1);
	search(N - 1, r, c);
	search(N - 1, r, c + n);
	search(N - 1, r + n, c);
	search(N - 1, r + n, c + n);
}

int main() {
	cin >> N >> R >> C;
	search(N, 0, 0);
}

결과 : 시간 초과

  이 풀이의 시간복잡도는 O(2^2N)인데 N이 최대 15이므로

  최대 걸리는 시간은 2^30 = 10,0000,0000 (10초) 이다.


내 풀이2 (2020.12.17.) :

#include <iostream>
#include <cmath>

using namespace std;

int N, R, C;
int cnt = 0;

void search(int N, int r, int c) {
	if (N == 0) {
		if(R == r && C == c){
			cout << cnt;
		}
		return;
	}

	int n = pow(2, N - 1);
	int nn = pow(4, N - 1);

	if ((R < r + n) && (C < c + n)) {
		cnt += nn * 0;
		search(N - 1, r, c);
	}
	else if ((R < r + n) && (C >= c + n)) {
		cnt += nn * 1;
		search(N - 1, r, c + n);
	}
	else if ((R >= r + n) && (C < c + n)) {
		cnt += nn * 2;
		search(N - 1, r + n, c);
	}
	else if ((R >= r + n) && (C >= c + n)) {
		cnt += nn * 3;
		search(N - 1, r + n, c + n);
	}
}

int main() {
	cin >> N >> R >> C;
	search(N, 0, 0);
}

 

결과 : 제한 시간 내 성공

  r, c를 확인하면서 4개 자식 노드들 중 1개만을 탐색하되

  nn을 통해 cnt를 자동으로 카운트 해주었다.

  이 풀이의 시간복잡도는 O(N) 밖에 되지 않는다.

'알고리즘 > 완전 탐색' 카테고리의 다른 글

백트래킹 개념  (0) 2021.01.05
백준 11724번 : 연결 요소의 개수  (0) 2021.01.03
백준 1012번 : 유기농 배추  (0) 2021.01.02
BFS 개념  (0) 2020.12.21
백준 6603번 : 로또  (0) 2020.12.16