이 문제는 아예 전혀 푸는 방법을 몰랐다.
블로그 참고
1. 각 세대별 선분이 그어지는 방향의 규칙을 찾아라
2. 그 규칙에 따라 입력값으로 주어지는 데이터에 대해 선분을 긋고
3. count
https://yabmoons.tistory.com/60
[문제보기]
15685. 드래곤 커브
[풀이과정]
이 문제에서 제시하는 조건에 맞춰서 세대별 드래곤 커브를 만들면,
0세대 : →
1세대 : → ↑
2세대 : → ↑ ← ↑
3세대 : → ↑ ← ↑ ← ↓ ← ↑
이렇게 화살표가 그려지는데, 잘 살펴보면 규칙성이 있는 것을 알 수 있다.
1세대는 0 세대의 화살표 + 그 화살표를 반시계 방향으로 90도 돌렸다.
그리고 2세대는 1세대의 화살표 + 1세대의 마지막부터 첫 번째 순서까지 반시계 방향으로 90도 돌린 화살표
따라서, 규칙은 전 세대 화살표 + 전 세대 화살표의 마지막 순번부터 첫 번째 순번까지 화살표들을 반시계
방향으로 90도 돌린 것의 집합이 된다.
필자는 각각 드래곤 커브의 수마다 계산을 해주었고, dragon() 함수를 만들었다.
dragon(int x, int y, int d, int g)
-> 이 함수는 vector direction을 이용해 드래곤 커브의 방향을 만들어 줄 건데, 세대별로 현재의 direction의 크기만큼
마지막 순번부터 처음 순번까지 반시계 방향으로 화살표를 돌려주어 direction에 저장해준다.. 이때, 반시계 방향으로
돌리는 연산은 calculation() 함수를 이용했다. 그러고 나서 각 좌표를 계산하여 map[][] 배열에 1로 채워준다.
마지막으로, map[][] 배열을 돌면서 정사각형이 만들어지는 부분을 찾고 ans를 1 증가해 준다.
[소스코드]
#include <iostream>
#include <vector>
using namespace std;
int n, ans = 0;
int map[101][101] = {0};
pair<int, int> dir[4] = {{0, 1}, {-1, 0}, {0, -1}, {1, 0}};
void all_print(){
cout << "\n";
for(int i=0; i<11; i++){
for(int j=0; j<11; j++){
cout << map[i][j] << " ";
}
cout << "\n";
}
}
int calculation(int d){
return d+1 > 3 ? 0 : d+1;
}
void dragon(int x, int y, int d, int g){
vector<int> direction;
direction.push_back(d);
for(int i=0; i<g; i++){
int size = direction.size();
for(int j=size-1; j>=0; j--){
int d = calculation(direction[j]);
direction.push_back(d);
}
}
map[y][x] = 1;
int nexty, nextx;
for(int i=0; i<direction.size(); i++){
nexty = y + dir[direction[i]].first;
nextx = x + dir[direction[i]].second;
if(nexty < 0 || 100 < nexty || nextx < 0 || 100 < nextx) continue;
map[nexty][nextx] = 1;
y = nexty;
x = nextx;
}
}
int main(){
cin >> n;
int x, y, d, g;
for(int i=0; i<n; i++){
cin >> x >> y >> d >> g;
dragon(x, y, d, g);
}
all_print();
for(int i=0; i<101; i++){
for(int j=0; j<101; j++){
if(map[i][j] == 1 && map[i+1][j] == 1 && map[i][j+1] == 1 && map[i+1][j+1] == 1){
ans++;
}
}
}
cout << ans;
}
[해결 과정 중 실수한 부분]
8월 25일에 못 풀고 다시 푼 문제이지만, 드래곤 커브의 규칙성을 찾느라 손으로 썼다 지웠다를 좀 했다.
'알고리즘 스터디 > Beakjoon' 카테고리의 다른 글
[백준 2579][C++] 계단 오르기 (Silver 3) (0) | 2020.08.28 |
---|---|
[백준 16235][C++] 나무 재테크 (Gold4) (0) | 2020.08.25 |
[백준 17144][C++] 미세먼지 안녕! (Gold 5) (0) | 2020.08.25 |
[백준 16236][C++] 아기 상어 (Gold5) (0) | 2020.08.24 |
[백준 16234][C++] 인구 이동(Gold 5) (0) | 2020.08.23 |