YoonWould!!

[삼성SWTest준비] 15685번 드래곤커브 본문

<SW>/알고리즘 + 자료구조

[삼성SWTest준비] 15685번 드래곤커브

Hading 2018. 10. 17. 22:30
728x90

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


삼성SW 기출 문제 한 번에 보기 : https://www.acmicpc.net/workbook/view/1152




※삼성 SW 역량평가 기출문제 어떻게 풀지?


1. 문제 이해

 - 방향정보를 설정하고 저장한다!

 - 시작점에서 드래곤 커브를 그릴때, 방향정보대로 그려나간다.

 - 입력된 모든 시작점에 대해 1.2.를 반복한다.

 - 모든 시작점에 대해 드래곤커브를 그렸다면, 그려진 2차원 배열을 하나씩 탐색하며 4개의 꼭지점이 모두 드래곤커브에 해당되는지 체크한다.



※필요 역량 정리하기!!!※

1. 시뮬레이션

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/*
드래곤 커브
*/
 
#include<iostream>
#include<vector>
using namespace std;
 
int map[101][101];
int n,ans=0;
int dx[4= { 1,0,-1,0 };
int dy[4= { 0,-1,0,1 };
int x, y, d, g,s;
/*
0: x좌표가 증가하는 방향 (→)
1: y좌표가 감소하는 방향 (↑)
2: x좌표가 감소하는 방향 (←)
3: y좌표가 증가하는 방향 (↓)
*/
int change(int d)
{
    // 방향 전환
    if (d == 0 || d == 1) d += 2;
    else d -= 2;
    // 왼쪽으로 90도 회전
    if (d == 0) d = 3;
    else d--;
    return d;
}
int main() {
    
    cin >> n;
    for (int i = 0; i < n; i++) {
        vector<int> dir;
        cin >> x >> y >> d >> g;
        dir.push_back(d);
        // 여기서 바로 드래곤 커브 만든다.
 
        while (g--) {
            s = dir.size();
            for (int i = s - 1; i >= 0; i--) {
                dir.push_back(change(dir[i]));
            } // 경로를 설정하고 
        }
        map[x][y] = 1// 처음 위치 표시
        s = dir.size(); // 방향 돌릴 사이즈
        for (int i = 0; i < s; i++)
        {
            x += dx[dir[i]], y += dy[dir[i]];
            map[x][y] = 1;
        }//길을 그린다.
    }
    for (int i = 0; i < 100; i++for (int j = 0; j < 100; j++)
        if (map[i][j] && map[i + 1][j] && map[i][j + 1&& map[i + 1][j + 1])
            ans++;
    cout << ans;
    return 0;
cs


728x90