본문 바로가기

알고리즘 · 코딩

[백준 15685번] 드래곤 커브

삼성 SW 역량 테스트 기출 문제 / 삼성 코딩테스트

 

문제 링크

www.acmicpc.net/problem/15685

 

15685번: 드래곤 커브

첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커

www.acmicpc.net


C++ 풀이

#include <iostream>
#include <vector>
using namespace std;

int board[101][101] = { 0, };

void curve(vector<pair<int, int>> points, int cur_gen, int target_gen) {
	if (cur_gen >= target_gen)
		return;
	int last_x = points.back().first, last_y = points.back().second;
	vector<pair<int, int>> curve_points = points;

	//끝점을 시작으로 하여 연결된 점과의 x, y 차이를 구하여 계산
	for (int i = points.size() - 2; i >= 0; i--){
		curve_points.push_back(
			{ last_x - (points[i].second - points[i + 1].second),
			last_y + (points[i].first - points[i + 1].first) });
		last_x -= points[i].second - points[i + 1].second;
		last_y += points[i].first - points[i + 1].first;
		board[last_x][last_y] = 1;  //보드에 커브 꼭지점 체크
	}
	curve(curve_points, cur_gen + 1, target_gen);
	return;
}

int main() {
	int N;
	cin >> N;
	for (int i = 0; i < N; i++) {
		int x, y, d, g;
		cin >> x >> y >> d >> g;
		int x1 = x, y1 = y;
		switch (d) { //시작 방향
		case 0:
			x1++;
			break;
		case 1:
			y1--;
			break;
		case 2:
			x1--;
			break;
		case 3:
			y1++;
			break;
		}
		board[x][y] = 1; board[x1][y1] = 1; //보드에 커브 꼭지점 체크
		curve({{x,y},{x1,y1}}, 0, g);
	}

	int answer = 0;
	for (int i = 0; i < 100; i++) {
		for (int j = 0; j < 100; j++) {
			if (board[i][j] == 1
				&& board[i + 1][j] == 1
				&& board[i][j + 1] == 1
				&& board[i + 1][j + 1] == 1)
				answer++;
		}
	}
	cout << answer;
	return 0;
}

끝점을 기준으로 시작하여 연결된 점과의 (X, Y)차이값을 구하여 90도 회전된 점의 좌표를 구하였다.

 

 

LIST