짱아의 개발 기록장

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

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

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

jungahshin 2021. 2. 8. 15:26
반응형

역시 삼성 문제 답게 구현하는 스킬을 가지고 있으면 충분히 풀 수 있는 문제였다.

다만, 나는 인접한 얼음이 있는 곳이 3개 이상이어야 한다는 조건을 구현하는 부분에서 for문으로 탐색하면서

-1을 해줬더니 약간의 오류가 생겨서 temp라는 배열을 따로 선언해서 구현했다.

 

rotate() : 회전시키는 함수

bfs() : 인접한 곳을 찾는 함수

area() : 가장 큰 영역을 찾는 함수

 

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
#include <iostream>
#include <queue>
#include <cmath>
 
using namespace std;
 
int n, q, N;
int ice[65][65= {0, };
int divide[1001= {0, };
int dx[4= {00-11};
int dy[4= {-1100};
int total = 0;
 
void rotate(int x, int y, int num)
{
    queue<int> q;
    for(int i=x; i<x+num; i++){
        for(int j=y; j<y+num; j++){
            q.push(ice[i][j]);
        }
    }
 
    for(int i=(y+num-1); i>=(y); i--){
        for(int j=x; j<(x+num); j++){
            int temp = q.front();
            q.pop();
            ice[j][i] = temp;
        }
    }
}
 
void bfs()
{
    int temp[65][65= {0, };
    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++){
            temp[i][j] = ice[i][j];
        }
    }
    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++){
            if(temp[i][j]==0continue;
            int cnt = 0;
            for(int k=0; k<4; k++){
                int nx = i+dx[k];
                int ny = j+dy[k];
                if(0<=nx && nx<&& 0<=ny && ny<&& temp[nx][ny]!=0){
                    cnt++;
                }
            }
            if(cnt<3){
                if(ice[i][j]==0continue;
                ice[i][j]--;
                total--;
            }
        }
    }
}
 
int area()
{
    int visited[65][65= {0, };
    int ans = 0;
    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++){
            if(visited[i][j] || ice[i][j]==0continue;
            queue<pair<intint>> q;
            q.push(make_pair(i, j));
            int cnt = 0;
            while(!q.empty()){
                int x = q.front().first;
                int y = q.front().second;
                visited[x][y] = 1;
                cnt++;
                q.pop();
 
                for(int k=0; k<4; k++){
                    int nx = x+dx[k];
                    int ny = y+dy[k];
                    if(0<=nx && nx<&& 0<=ny && ny<&& !visited[nx][ny]){
                        if(ice[nx][ny]!=0){
                            visited[nx][ny] = 1;
                            q.push(make_pair(nx, ny));
                        }
                    }
                }
            }
 
            ans = max(ans, cnt); 
        }
    }
 
    return ans;
}
 
int main()
{
    cin>>n>>q;
    N = pow(2, n);
    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++){
            cin>>ice[i][j];
            total += ice[i][j];
        }
    }
 
    for(int i=0; i<q; i++){
        cin>>divide[i];
    }
 
    for(int i=0; i<q; i++){ // 총 q번 파이어스톰 시전
        int cnt = 0;
        int num = pow(2, divide[i]);
        
        // 회전
        for(int j=0; j<N; j+=num){
            for(int k=0; k<N; k+=num){
                rotate(j, k, num);
            }
        }
 
        // 3개 이상 인접하지 않은 곳 얼음 -1
        bfs();
    }
 
    cout<<total<<"\n";
    cout<<area()<<"\n";
 
    return 0;
}
cs

 

반응형
Comments