백준 20056번 마법사 상어와 파이어볼

문제 링크

😊코드 설명

삼성 기출의 구현문제 이다. 문제를 따라가면 되지만 제대로 설계하고 풀지 않아서 디버깅하는데 꽤나 오래걸렸다.
구조체, 각각의 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;
}

좋은 웹페이지 즐겨찾기