본문 바로가기

Algorithm/Baekjoon

[Baekjoon] C++ 15685 드래곤커브

#사람마다 푼 방법이 다릅니다. 아 이런 코드도 있구나라는 생각만 가져주시면 감사하겠습니다. 제 코드에 있어서 비효율적인 부분이 있으면 댓글로 남겨놔 주시면 참고하여 성장할 수 있도록 하겠습니다!!!

 

하지만!!! 무분별한 비난은 삼가 주세요!

 

해당 문제는 처음 생각해보면 어렵지만, 규칙을 알면 쉽게 풀 수 있습니다.

 

세대를 지날수록 vector에 제일 마지막으로 추가된 방향부터 제일 처음의 방향까지 +1 한 값을 vector에 추가해줍니다. 중요한 점은, vector의 size를 미리 변수에 넣어줌으로써 예외처리를 막을 수 있습니다. 만약 추가해야 할 방향이 4면 범위를 벗어나기 때문에 0으로 만들어줌으로써 해결할 수 있습니다.

 

#include<iostream>
#include<vector>
#define SIZE 101

using namespace std;

int dx[4] = {0,-1,0,1};
int dy[4] = {1,0,-1,0};
vector<int> dir;
bool visit[SIZE][SIZE];
void init() {
	for (int a = 0; a < SIZE; a++) {
		for (int b = 0; b < SIZE; b++) {
			visit[a][b] = false;
		}
	}
}
int checkResult() {
	int ans = 0;
	for (int a = 0; a < SIZE-1; a++) {
		for (int b = 0; b < SIZE-1; b++) {
			if (visit[a][b] && visit[a][b + 1] && visit[a + 1][b] && visit[a + 1][b + 1]) {
				ans++;
			}
		}
	}
	return ans;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int t, x, y, d, g;
	cin >> t;
	init();
	for (int a = 0; a < t; a++) {
		dir.clear();
		cin >> y >> x >> d >> g;

		visit[x][y] = true;
		dir.push_back(d);

		for (int a = 0; a < g; a++) {
			//미리 vector의 사이즈를 받아서 반복문 시작해야한다.
			int index = dir.size() - 1;
			for (int b = index; b >= 0; b--) {
				int td = dir[b];
				td += 1;
				if (td == 4) td = 0;
				dir.push_back(td);
			}
		}
		for (int a = 0; a < dir.size(); a++) {
			x = x + dx[dir[a]];
			y = y + dy[dir[a]];
			//배열의 범위를 벗어나지 않아야한다.
			if (x >= 0 && y >= 0 && x < SIZE && y < SIZE) {
				visit[x][y] = true;
			}
		}
	}
	cout << checkResult();
}