반응형

문제출처

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

 

15685번: 드래곤 커브

첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커브의 시작 점, d는 시작 방향, g는 세대이다. (0 ≤ x, y ≤ 100, 0 ≤ d ≤ 3, 0 ≤ g ≤ 10) 입력으로 주어지는 드래곤 커브는 격자 밖으로 벗어나지 않는다. 드래곤 커브는 서로 겹칠 수 있다. 방향은 0, 1, 2,

www.acmicpc.net

 

문제풀이

정말 어려웠던 문제였다. 문제풀이의 핵심은 세대가 증가할 때 마다 방향전환의 규칙성을 찾는것이 핵심이다.

0 (동쪽)방향을 기준으로 예시를 들어보면 이해하는데 조금 더 편하다.

 

0세대 : 0

1세대 : 0 1

2세대 : 0 1 | 2 1

3세대 : 0 1 2 1 | 2 3 2 1

4세대 : 0 1 2 1 2 3 2 1 | 2 3 0 3 2 3 2 1

 

예시를 보면 알 수 있듯이 1세대에서 2세대의 방향정보를 만드는 규칙은 마지막 부분 +1을 추가하는 것이다. 2세대에서 3세대를 만들때도 같은 규칙을 사용한다. 하지만 +1을 계속하면 {0,1,2,3}의 인덱스가 깨지므로 +1한 값의 %4를 해주면 해당 세대의 방향정보를 알 수 있다.

 

그다음부터는 정말 단순한 구현이다. 이때 문제에서는 꼭지점을 기준으로 드래곤 커브를 그리고 있다. 이 기준을 단순 2차원 배열로 바꾸어 계산해 주면 된다. 2차원 배열에 표현하기 때문에 (x,y) <= 100인 조건은 (x,y) <= 101로 변환하여 풀이한다.

개인적으로 저 규칙을 알아내는것이 매우 힘들었다. 시간이 지나고 다시 풀어봐야 겠다.

 

소스코드

https://github.com/sw93/algorithm/blob/master/SW_TEST(samsung)/BOJ_15685/BOJ_15685/boj15685.cpp

 

sw93/algorithm

problem solve. Contribute to sw93/algorithm development by creating an account on GitHub.

github.com

#include <iostream>
#include <vector>
using namespace std;
const int MAX = 101;
const int dy[] = { 0, -1, 0, 1 };
const int dx[] = { 1, 0, -1, 0 };
int n, y, x, d, g;
int map[MAX][MAX];
int solve() {
	cin >> n;
	while (n--) {
		cin >> x >> y >> d >> g;
		vector<int> dir;
		dir.push_back(d);
		map[y][x] = 1;
		for (int i = 0; i < g; i++) {
			int dirSize = dir.size();
			for (int j = dirSize - 1; j >= 0; j--) {
				dir.push_back((dir[j] + 1) % 4);
			}
		}
		for (int i = 0; i < dir.size(); i++) {
			y += dy[dir[i]];
			x += dx[dir[i]];
			if (y < 0 || x < 0 || y >= MAX || x >= MAX) continue;
			map[y][x] = 1;
		}
	}
	int ret = 0;
	for (int r = 0; r < MAX - 1; r++) {
		for (int c = 0; c < MAX - 1; c++) {
			if (map[r][c] == 1 && map[r + 1][c] == 1 && map[r][c + 1] == 1 && map[r + 1][c + 1] == 1) {
				ret++;
			}
		}
	}
	return ret;
}
int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	cout<<solve();
	return 0;
}
반응형

'Algorithm' 카테고리의 다른 글

[BOJ 15683] 감시  (0) 2020.04.20
[BOJ 17140] 이차원 배열과 연산  (0) 2020.04.17
[BOJ 17142] 연구소3  (0) 2020.04.12
[BOJ 14888] 연산자 끼워넣기  (0) 2020.01.02
[BOJ 9021] 괄호  (0) 2019.12.18

+ Recent posts