삼성 기출의 구현문제 이다. 문제를 따라가면 되지만 제대로 설계하고 풀지 않아서 디버깅하는데 꽤나 오래걸렸다.
구조체, 각각의 index를 이용할때 실수하지 않도록하자.
#include<vector>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
struct fireball {
int y;
int x;
int m;
int s;
int d;
};
vector<fireball> ball;
vector<int> map[50][50];
int N, M, K;
int dy[8] = { -1, -1, 0, +1, +1, +1, 0, -1 };
int dx[8] = { 0, +1, +1, +1, 0, -1, -1, -1 };
void move() {
vector<int>new_map[50][50];
for (int i = 0; i < ball.size(); i++) {
int dir = ball[i].d;
int speed = (ball[i].s % N);
int ny = (ball[i].y + (dy[dir] * speed) + N) % N;
int nx= (ball[i].x + (dx[dir] * speed) + N) % N;
new_map[ny][nx].push_back(i);//ball이동 기록
ball[i].y = ny;
ball[i].x = nx; //ball이동
}
//new_map을 map에 다시 복사
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
map[i][j] = new_map[i][j];
}
}
}
void sum() {
vector<fireball>new_ball; //new_ball을 갱신시켜서 ball에 넣는 temp역할
for (int y = 0; y < N; y++) {
for (int x = 0; x < N; x++) {
if (map[y][x].size() == 0)
continue;
if (map[y][x].size() == 1) {
int index = map[y][x][0]; //한곳에 ball 하나만 있을때 단순 복사
new_ball.push_back(ball[index]);
continue;
}
//두개이상
int sum_m = 0;
int sum_s = 0;
bool odd = true;
bool even = true;
for (int i = 0; i < map[y][x].size(); i++) {
int index = map[y][x][i];
sum_m += ball[index].m;
sum_s += ball[index].s;
if (ball[index].d % 2 == 0) {
odd = false; //짝수다
}
else even = false;
}
if (sum_m / 5 == 0) {
continue;
}
int current_m = sum_m / 5;
int current_s = sum_s / map[y][x].size();
for (int i = 0; i < 4; i++) {
if (odd || even) { //모두 짝수이거나 모두 홀수
new_ball.push_back({ y,x,current_m,current_s,i * 2 });
}
else
new_ball.push_back({ y,x,current_m,current_s,i * 2 +1});
}
}
}
ball = new_ball;
}
int solve() {
while (K--) {
move();
sum();
}
int result = 0;
for (int i = 0; i < ball.size(); i++) {
result += ball[i].m;
}
return result;
}
int main() {
cin >> N >> M >> K;
for (int i = 0; i < M; i++) {
int y, x, m, s, d;
cin >> y >> x >> m >> s >> d;
y--;
x--;
ball.push_back({ y,x,m,s,d });
map[y][x].push_back(i);
}
int answer=solve();
cout << answer;
return 0;
}