알고리즘문제 풀어보기/백준

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

rimugiri 2024. 10. 6. 22:34
728x90

 

해결과정 - 단순 구현

처음 문제를 본뒤 그냥 단순 구현이구나 라는 생각으로 주어진 대로 문제를 풀었다 하지만 테스트 케이스 중에 2번재 과정이 계속 틀려 곰곰히 생각하던 와중 1 과 N이 연결되있다는 것을 제대로 읽지 않고 N 이상으로 파이어 볼이 나가면 사라지도록 만들어서 틀렸던 것이였다

 

결과적으로는 그냥 단순 구현문제이면서 파이어볼이 이동할때 범위를 벋어나면 다시 원래 범위로 복귀 시켜주는 문제였다..

 

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<stack>
#include<set>
#include<queue>

#define Fast ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
using namespace std;

typedef long long ll;

struct Ball {
	int mass;
	int speed;
	int dir;

	Ball(int mass, int speed, int dir) : mass(mass), speed(speed), dir(dir) {}
};

int dirX[8] = { 0, 1, 1, 1, 0, -1, -1, -1 };
int dirY[8] = { -1, -1, 0, 1, 1, 1, 0, -1 };

int n, m, k;
vector<vector<vector<Ball>>> board;

void MoveBall() {
	vector<vector<vector<Ball>>> newBoard(n + 1, vector<vector<Ball>>(n + 1));

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			int size = board[i][j].size();
			
			for (int k = size - 1; k >= 0; k--) {
				int mass = board[i][j][k].mass;
				int speed = board[i][j][k].speed;
				int dir = board[i][j][k].dir;

				board[i][j].pop_back();

				int nx = j + dirX[dir] * speed;
				int ny = i + dirY[dir] * speed;

				if (nx < 1) nx = n - abs(nx) % n;
				if (ny < 1) ny = n - abs(ny) % n;
				if (nx > n) nx = nx % n;
				if (ny > n) ny = ny % n;
				if (nx == 0) nx = n;
				if (ny == 0) ny = n;

				newBoard[ny][nx].push_back(Ball(mass, speed, dir));
			}
		}
	}

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			for (int k = 0; k < newBoard[i][j].size(); k++) {
				board[i][j].push_back(newBoard[i][j][k]);
			}
		}
	}
}

void MergeBall() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (board[i][j].size() > 1) {
				int totalMass = 0;
				int totalSpeed = 0;
				int odd = 0;
				int even = 0;

				int boardSize = board[i][j].size();

				for (int k = boardSize - 1; k >= 0; k--) {
					totalMass += board[i][j][k].mass;
					totalSpeed += board[i][j][k].speed;

					if (board[i][j][k].dir % 2 == 0) even++;
					else odd++;

					board[i][j].pop_back();
				}

				int newMass = totalMass / 5;
				int newSpeed = totalSpeed / boardSize;

				if (newMass == 0) continue;

				if (even == boardSize || odd == boardSize) {
					for (int k = 0; k < 4; k++) {
						board[i][j].push_back(Ball(newMass, newSpeed, k * 2));
					}
				}
				else {
					for (int k = 0; k < 4; k++) {
						board[i][j].push_back(Ball(newMass, newSpeed, k * 2 + 1));
					}
				}
			}
		}
	}
}

int main() {
	Fast;
	cin >> n >> m >> k;

	board.resize(n + 1);
	for (int i = 0; i <= n; i++) {
		board[i].resize(n + 1);
	}
	

	for (int i = 1; i <= m; i++) {
		int y, x, mass, speed, dir;
		cin >> y >> x >> mass >> speed >> dir;

		board[y][x].push_back(Ball(mass, speed, dir));
	}

	for (int i = 0; i < k; i++) {
		MoveBall();
		MergeBall();
	}

	int answer = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			for (int k = 0; k < board[i][j].size(); k++) {
				answer += board[i][j][k].mass;
			}
		}
	}

	cout << answer << "\n";

	return 0;
	
}

 

 

후기

쉬운문제라고 단순하게 보았다가 40분이나 걸려버렸다.. 문제를 잘읽자..

728x90

'알고리즘문제 풀어보기 > 백준' 카테고리의 다른 글

백준 - 2467 용액  (1) 2024.10.07
백준 2166 - 다각형의 넓이  (0) 2024.10.07
백준 - 32462 Construct a coin set  (1) 2024.10.06
백준 - 32464 Grateful triangle  (0) 2024.10.06
백준 - 32394 4-cycle(easy)  (0) 2024.10.06