본문 바로가기

백준/삼성기출

드래곤 커브

728x90

www.acmicpc.net/problem/15685

 

15685번: 드래곤 커브

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

www.acmicpc.net

#include <iostream>
#include <vector>
#include <map>
#include <cstring>

using namespace std;

int n;

int dx[] = {0,-1,0,1};
int dy[] = {1,0,-1,0}; // 0,1,2,3

int sqx[] = {0,1,0,1};
int sqy[] = {0,0,1,1};

bool check[101][101];

int ex, ey;
vector<int>dragon;


bool cango(int x, int y) {

	return x >= 0 && x <= 100 && y >= 0 && y <= 100;
}

void checkDragon(vector<int>&dragon) {
	
	
	int sz = dragon.size(); // stack의 원리를 이용한다.

	for (int i = sz - 1; i >= 0; i--) {
		
		int dir = (dragon[i] + 1) % 4;

		ex = ex + dx[dir];
		ey = ey + dy[dir];

		check[ex][ey] = true;

		dragon.push_back(dir);
	
	}

}

int findSquare() {

	int count = 0; 
	for (int i = 0; i<= 99; i++) { 
		for(int j=0; j<=99; j++){

			bool toggle = true;
			
			for (int t = 0; t < 4; t++) {

				int tx = i + sqx[t];
				int ty = j + sqy[t];

				if (check[tx][ty]== false) { 
					toggle = false;
					break;
				}
			}

			if (toggle == true) {
				count++;
			}
		}
	}

	return count;
}


int main() {
	
	cin >> n;
	int x, y, d, g;

	memset(check, false, sizeof(check));

	for (int i = 0; i < n; i++) {
	
		cin >> y;  //입력은 y,x 순으로 받아야함. 
		cin >> x;
		cin >> d;
		cin >> g;

		dragon.clear();

		check[x][y] = true;

		ex = x + dx[d];
		ey = y + dy[d];

		check[ex][ey] = true;

		dragon.push_back(d);

		for (int i = 0; i < g; i++) {
			checkDragon(dragon);
		}
	}

	cout <<findSquare()<<endl;

}

- 스택을 이용해야 한다는게 신박했던 문제인것 같다.

'백준 > 삼성기출' 카테고리의 다른 글

큐빙  (0) 2021.04.19
치킨 배달  (0) 2021.04.19
어른상어/ 시뮬레이션  (0) 2021.04.12
청소년 상어/ 백트래킹  (0) 2021.04.12
주사위 윷놀이, 비트연산자  (0) 2021.04.12