짱아의 개발 기록장

[Algorithm] 2020 하반기 삼성전자 코딩테스트 - 마법사 상어와 토네이도(c++) 본문

Algorithm/삼성 sw 역량테스트 기출

[Algorithm] 2020 하반기 삼성전자 코딩테스트 - 마법사 상어와 토네이도(c++)

jungahshin 2021. 2. 7. 23:18
반응형

가장 헷갈렸던 부분이...

x->y로 토네이도가 이동할때 y에 있던 모든 모래들이 비율과 α가 적혀있는 칸으로 이동하는 것인데

x에 있던 모래가 이동하는 것으로 문제를 잘못 읽어서 처음 설계할때,,, 시간이 좀 걸렸다 ㅎㅎ

문제를 잘 읽고 구현만 잘 해준다면 무난무난한 문제였다!

 

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <iostream>
#include <vector>
using namespace std;
 
int n;
int map[500][500= {0, };
int dx[4= {010-1};
int dy[4= {-1010};
vector<pair<pair<intint>int>> rate[4];
int total = 0// 격자 밖으로 나간 모래의 양
 
void setting()
{
    rate[0].push_back(make_pair(make_pair(-11), 1));
    rate[0].push_back(make_pair(make_pair(11), 1));
    rate[0].push_back(make_pair(make_pair(-10), 7));
    rate[0].push_back(make_pair(make_pair(10), 7));
    rate[0].push_back(make_pair(make_pair(-20), 2));
    rate[0].push_back(make_pair(make_pair(20), 2));
    rate[0].push_back(make_pair(make_pair(-1-1), 10));
    rate[0].push_back(make_pair(make_pair(1-1), 10));
    rate[0].push_back(make_pair(make_pair(0-2), 5));
 
    rate[1].push_back(make_pair(make_pair(-1-1), 1));
    rate[1].push_back(make_pair(make_pair(-11), 1));
    rate[1].push_back(make_pair(make_pair(0-1), 7));
    rate[1].push_back(make_pair(make_pair(01), 7));
    rate[1].push_back(make_pair(make_pair(0-2), 2));
    rate[1].push_back(make_pair(make_pair(02), 2));
    rate[1].push_back(make_pair(make_pair(1-1), 10));
    rate[1].push_back(make_pair(make_pair(11), 10));
    rate[1].push_back(make_pair(make_pair(20), 5));
 
    rate[2].push_back(make_pair(make_pair(-1-1), 1));
    rate[2].push_back(make_pair(make_pair(1-1), 1));
    rate[2].push_back(make_pair(make_pair(-10), 7));
    rate[2].push_back(make_pair(make_pair(10), 7));
    rate[2].push_back(make_pair(make_pair(-20), 2));
    rate[2].push_back(make_pair(make_pair(20), 2));
    rate[2].push_back(make_pair(make_pair(-11), 10));
    rate[2].push_back(make_pair(make_pair(11), 10));
    rate[2].push_back(make_pair(make_pair(02), 5));
 
    rate[3].push_back(make_pair(make_pair(1-1), 1));
    rate[3].push_back(make_pair(make_pair(11), 1));
    rate[3].push_back(make_pair(make_pair(0-1), 7));
    rate[3].push_back(make_pair(make_pair(01), 7));
    rate[3].push_back(make_pair(make_pair(0-2), 2));
    rate[3].push_back(make_pair(make_pair(02), 2));
    rate[3].push_back(make_pair(make_pair(-1-1), 10));
    rate[3].push_back(make_pair(make_pair(-11), 10));
    rate[3].push_back(make_pair(make_pair(-20), 5));
}
 
void move(int x, int y, int dir)
{
    int num = map[x][y]; // 기존 모래의 양
    int temp = 0// (num-temp)가 알파에게 줄 모래의 양
    map[x][y] = 0;
    for(int i=0; i<rate[dir].size(); i++){
        int nx = x+rate[dir][i].first.first;
        int ny = y+rate[dir][i].first.second;
        int NUM = num*((float)rate[dir][i].second/100);
        temp += NUM;
        if(0<=nx && nx<&& 0<=ny && ny<n){
            map[nx][ny] += NUM;
        }else{
            total += NUM;
        }
    }
 
    // 남은 모래양은 알파 자리에 더해준다.
    int nx, ny;
    if(dir==0){
        nx = x;
        ny = y-1;
    }else if(dir==1){
        nx = x+1;
        ny = y;
    }else if(dir==2){
        nx = x;
        ny = y+1;
    }else{
        nx = x-1;
        ny = y;
    }
    if(0<=nx && nx<&& 0<=ny && ny<n){
        map[nx][ny] += (num-temp);
    }else{
        total += (num-temp);
    }
}
 
int main()
{
    cin>>n;
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cin>>map[i][j];
        }
    }
 
    int x = n/2, y = n/2;
    int num = 1;
    int cnt = 0;
    int dir = 0;
 
    setting();
 
    while(1){
        if(x==0 && y==0){
            break;
        }
        cnt++;
        for(int i=0; i<num; i++){
            int nx = x+dx[dir];
            int ny = y+dy[dir];
            if(0<=nx && nx<&& 0<=ny && ny<n){
                move(nx, ny, dir);
            }
            x = nx, y = ny;
        }
 
        if(cnt==2 && num!=n-1){
            cnt = 0;
            num++;
        }
        dir = (dir+1)%4;
    }
 
    cout<<total<<"\n";
    return 0;
}
cs
반응형
Comments