시뮬레이션
삼성 SW 기출
1. 문제 해결 아이디어
1. 낚시왕은 0번 col에서 오른쪽으로 한 칸 이동
2. 낚시왕이 있는 열에서 땅과 제일 가까운(row값이 가장 작은 상어)를 잡는다
3. 상어이동
상어
- 방향, 크기, 속도
특정방향으로 이동하다가 벽을 만나면 방향을 바꿔서 뒤로 감
상어 객체 생성
모든 상어가 일단 이동하고
겹치게 된 상어가 있으면 크기가 가장 큰 애들만 살아남음
맵에는 상어가 2마리 이상 있다는걸 알 수 있는 장치가 필요함
solve함수를 보면 알겠지만 우선 낚시를 해서 상어를 잡는게 우선이다. fishing()
어부가 상어를 잡는 과정은 매우 간단하다.
현재 어부가 서있는 col에서 가장 작은 row값을 가진 상어를 없애면 된다.
그리고 현재 맵에있는 상어들을 움직여주기 위해서 Shark벡터에 넣어주었다.
Shark벡터에서 상어를 한 마리씩 뽑으면서 방향에 맞게 움직여 주었다.
개별 상어를 올바른 방향으로 올바른 거리만큼 움직이는게 이 문제의 key point라고 생각한다.
상어가 가로 방향으로 움직인다고 가정하자
R이 7이고 상어의 위치가 2라면 좌우 어디로든 12칸 이동후에는 현재 위치한 칸과 이동방향이 똑같을 것이다.
왜 12칸 인지는 (7-1)*2 를 통해서 구할 수 있다.
그림을 직접 그려보면서 이해하는걸 추천함!
상어를 이동시켰다면 tempshark벡터에 차례차례 넣어준다.
그리고 현재 Map에 있는 상어들을 reset시켜주고
tempshark에 이동을 마친 상어들이 있으므로 Map으로 상어들을 배치해 준다.
런타임에러가 여러번 발생했었는데..
이유가 OutOfBounds라고 한다..
처음에 vector tempshark를 shark_move()함수 안에다가 매번 설정하는 방식을 사용했었다.
그러다가 설마설마하는 마음에 tempshark를 전역으로 놔두고 clear를 통해서 재사용을 해보자는 마음으로 그렇게 했더니 맞았습니다! 가 뜨더라....
스택이 터져서 런타임에러가 발생한것같은 느낌이다.
하나 알고갑니다~
2. 코드
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#define fasti ios_base::sync_with_stdio(false); cin.tie(0);
#define fastio ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define INF 1e9+7
#define pii pair<int, int>
typedef long long ll;
// typedef pair<int, int> pii;
using namespace std;
struct Shark{
int r, c, s, d, z;
};
struct Core{
int s, d, z;
};
int R, C, M, ans;
vector<Shark> Sharks, tempsharks;
Core Map[101][101]; //상어의 크기만 가지고 있는 배열
// d가 1인 경우는 위, 2인 경우는 아래, 3인 경우는 오른쪽, 4인 경우는 왼쪽
int dr[5] = {0, -1, 1, 0, 0};
int dc[5] = {0, 0, 0, 1, -1};
void input(){
int r, c, s, d, z;
cin >> R >> C >> M;
for(int i = 0; i < M; i++){
cin >> r >> c >> s >> d >> z;
Map[r][c] = {s, d, z};
}
}
void fishing(int fisher){
for(int r = 1; r <= R; r++){
if(!Map[r][fisher].z) continue;
ans += Map[r][fisher].z;
Map[r][fisher] = {0, 0, 0};
return;
}
}
void ready_to_move(){
Sharks.clear();
for(int r = 1; r <= R; r++){
for(int c = 1; c <= C; c++){
if(!Map[r][c].z) continue;
Sharks.push_back({r, c, Map[r][c].s, Map[r][c].d, Map[r][c].z});
}
}
}
void reset(){
for (int r = 1; r <= R; r++){
for (int c = 1; c <= C; c++){
Map[r][c] = {0, 0, 0};
}
}
}
void move(vector<Shark> &temp, Shark &nowS){
int speed = nowS.s;
int dir = nowS.d;
int nr = nowS.r;
int nc = nowS.c;
int dist;
if(dir == 1 || dir == 2) dist = speed % ((R-1)*2);
else if(dir == 3 || dir == 4) dist = speed % ((C-1)*2);
while (dist){
if(dir == 1){
if(nr == 1){
dir = 2;
nr += dr[2];
}
else nr += dr[1];
}
else if(dir == 2){
if(nr == R){
dir = 1;
nr += dr[1];
}
else nr += dr[2];
}
else if(dir == 3){
if(nc == C){
dir = 4;
nc += dc[4];
}
else nc += dc[3];
}
else if(dir == 4){
if(nc == 1){
dir = 3;
nc += dc[3];
}
else nc += dc[4];
}
dist--;
}
temp.push_back({nr, nc, speed, dir, nowS.z});
}
void shark_move(){
//이동한 상어들의 임시공간
tempsharks.clear();
for(auto &now : Sharks){
move(tempsharks, now);
}
reset();
// 크기가 가장 큰 상어들만 남기는 작업
for(auto &s : tempsharks){
if(s.z > Map[s.r][s.c].z){
Map[s.r][s.c] = {s.s, s.d, s.z};
}
}
}
void solve(){
int fisher = 1;
while(fisher <= C){
fishing(fisher);
ready_to_move();
shark_move();
fisher++;
}
cout << ans;
}
int main(){
fasti
input();
solve();
return 0;
}
|
cs |
'Algorithm > BOJ' 카테고리의 다른 글
[백준 17144] 미세먼지 안녕! C++ (0) | 2021.07.12 |
---|---|
[백준 1613] 역사 C++ (0) | 2021.07.12 |
[백준 11779] 최소 비용 구하기 2 C++ (0) | 2021.07.09 |
[백준 14003] 가장 긴 증가하는 부분 수열5 C++ (0) | 2021.07.08 |
[백준 3055] 탈출 C++ (0) | 2021.07.07 |