[백준 15685번 C/C++] 드래곤 커브

 

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


 

 

해결전략

 

구현

 

처음 시도할 때, 그려지는 모든 좌표를 기록한 후 재귀를 돌려 90도 회전시켰다. 좋지 않은 방법이고 재귀이기 때문에 시간초과가 나온다. 

 

 

핵심 아이디어

  • vector<int> dots;
  • 꼭지점의 좌표가 아닌 방향을 저장한다
    • 생성되는 꼭지점을 dots 배열에 담는다. 이 때, 배열의 값은 방향이다.
    • 배열의 값(=방향)을 회전시킬 때 업데이트한다.

 

 

정답 코드

 

#include <iostream>
#include <vector>
using namespace std;
int dirY[4] = { 0, -1, 0, 1 };
int dirX[4] = { 1, 0, -1, 0 };
int n; // 커브의 개수
vector<vector<int>> v(101, vector<int>(101));
int CountSquare()
{
int answer = 0;
for (int y = 0; y < 100; y++){
for (int x = 0; x < 100; x++) {
if (v[y][x] == 1 && v[y][x+1] == 1 && v[y+1][x] == 1 && v[y+1][x+1] == 1){
answer++;
}
}
}
return answer;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n;
for (int i = 0; i < n; i++){
int x, y, d, g;
cin >> x >> y >> d >> g;
// 세대별 방향 계산
vector<int> dots;
dots.push_back(d); // 최초의 방향 추가
for (int j = 0; j < g; j++)
{
int size = dots.size();
for (int k = size - 1; k >= 0; k--){
dots.push_back((dots[k] + 1) % 4);
}
}
// 점 찍기
v[y][x] = 1; // 시작점
for (int j = 0; j < dots.size(); j++){
y += dirY[dots[j]]; // y를 업데이트
x += dirX[dots[j]]; // x를 업데이트
v[y][x] = 1; // 업데이트된 위치에 점을 찍음
}
}
cout << CountSquare();
return 0;
}

 

 


 

 

헷깔린 부분

 

처음 시도했다 틀린코드

  • ny와 nx라는 새로운 변수를 사용하여 다음 점의 위치를 계산한 후, 이를 바로 v[ny][nx] = 1;에 사용한다.
  • 이 방법에서는 x와 y의 값을 업데이트하지 않기 때문에 모든 점이 시작점을 기준으로만 그려지며, 이는 드래곤 커브의 정의와 맞지 않다.
  • 따라서 드래곤 커브가 연속적으로 그려지지 않고, 잘못된 위치에 점이 찍히게 된다.
v[y][x] = 1; // 시작점
for (int j = 0; j < dots.size(); j++){
int ny = y + dirY[dots[j]];
int nx = x + dirX[dots[j]];
v[ny][nx] = 1;
}

 

 

정답 코드

  • 드래곤 커브를 그릴 때 xy 변수를 직접 업데이트하여 다음 점을 찍는다.
  • 드래곤 커브의 연속성을 유지하는 올바른 방법이다.
  • 각 세대의 커브가 이전 세대의 마지막 점에서 올바르게 시작하여 연속적으로 그려진다.
v[y][x] = 1; // 시작점
for (int j = 0; j < dots.size(); j++){
y += dirY[dots[j]];
x += dirX[dots[j]];
v[y][x] = 1;
}

 

 

 

정확한 드래곤 커브를 그리기 위해서는 각 점을 찍은 후에 x와 y의 값을 계속해서 업데이트해야 한다. 

그렇지 않으면 모든 점이 첫 번째 점을 기준으로만 그려지게 되어, 드래곤 커브가 아닌 다른 형태가 그려지게 된다. 


 

 

 

해설

 

https://www.youtube.com/watch?v=Z2adRzVIPdY&t=8s