728x90
반응형
https://www.acmicpc.net/problem/20056
20056번: 마법사 상어와 파이어볼
첫째 줄에 N, M, K가 주어진다. 둘째 줄부터 M개의 줄에 파이어볼의 정보가 한 줄에 하나씩 주어진다. 파이어볼의 정보는 다섯 정수 ri, ci, mi, si, di로 이루어져 있다. 서로 다른 두 파이어볼의 위치
www.acmicpc.net
1. Logic
1. 파이어볼을 이동시킨다. 이떄 참조자를 통해 파이어볼의 x, y좌표를 계산해서 변경한 후 임시 그래프에 넣어준다.
2. 파이어볼 이동이 끝나면 합쳐줘야한다. 모든 파이어볼의 방향이 짝수거나 홀수면 0,2,4,6으로 가야하기 떄문에 홀짝을 bool로 판단한다.
3. 홀짝 판단 여부를 가지고 방향을 정해서 다시 임시 벡터에 넣어준다.
4. k번 동안 다 돌고나서 벤터를 순회해서 남은 파이어볼의 부피를 다 더해준다
음의 가중치가 있어서 x, y좌표를 이동시키는데에서 자꾸 오류가 생겼다,,, 그래서 이동하는 값의 최대 값이 1000을 더해서 구하도록 코드를 짜서 해결했다
2. Code
#include <bits/stdc++.h>
using namespace std;
int N, M, K;
int dx[8] = {0, 1, 1, 1, 0, -1, -1, -1};
int dy[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
int oddDir[4] = {1, 3, 5, 7};
int evenDir[4] = {0, 2, 4, 6};
struct fireball {
int y;
int x;
int m;
int s;
int d;
};
vector<fireball> balls[51][51];
int start() {
while(K--) {
vector<fireball> temp[51][51];
//파이어볼 이동
for(int i = 1; i <= N; i++) {
for(int j = 1; j <= N; j++) {
if(balls[i][j].empty()) continue;
for(int k = 0; k < balls[i][j].size(); k++) {
fireball fb = balls[i][j][k];
int &y = fb.y;
int &x = fb.x;
int dir = fb.d;
int speed = fb.s;
int weight = fb.m;
y = ((dy[dir] * speed) + y - 1 + 1000) % N + 1;
x = ((dx[dir] * speed) + x - 1 + 1000) % N + 1;
temp[y][x].push_back(fb);
}
}
}
//파이어볼 합체
vector<fireball> tmp[51][51];
for(int i = 1; i <= N; i++) {
for(int j = 1; j <= N; j++) {
if(temp[i][j].size() == 0) {
continue;
}
else if(temp[i][j].size() == 1) {
tmp[i][j].push_back(temp[i][j][0]);
continue;
}
int messSum = 0;
int speedSum = 0;
int ballsCnt = temp[i][j].size();
bool isOdd = true; //홀수
bool isEven = true; //짝수
for(int k = 0; k < ballsCnt; k++) {
messSum += temp[i][j][k].m;
speedSum += temp[i][j][k].s;
int ballDir = temp[i][j][k].d;
if(ballDir % 2 == 0) {
isOdd = false;
}
else {
isEven = false;
}
}
int finalMess = messSum / 5;
int finalSpeed = speedSum / ballsCnt;
if(finalMess == 0) continue;
if(isOdd == true || isEven == true) {
for(int k = 0; k < 4; k++) {
tmp[i][j].push_back({i, j, finalMess, finalSpeed, evenDir[k]});
}
}
else {
for(int k = 0; k < 4; k++) {
tmp[i][j].push_back({i, j, finalMess, finalSpeed, oddDir[k]});
}
}
}
}
for(int i = 1; i <= N; i++) {
for(int j = 1; j <= N; j++) {
balls[i][j] = tmp[i][j];
}
}
}
int res = 0;
for(int i = 1; i <= N; i++) {
for(int j = 1; j <= N; j++) {
if(balls[i][j].empty()) continue;
for(int k = 0; k < balls[i][j].size(); k++) {
res += balls[i][j][k].m;
}
}
}
return res;
}
int main() {
ios_base::sync_with_stdio(false); cout.tie(0); cin.tie(0);
cin >> N >> M >> K;
for(int i = 0; i < M; i++) {
int r, c, m, s, d;
cin >> r >> c >> m >> s >> d;
balls[r][c].push_back({r, c, m, s, d});
}
cout << start();
}
알고리즘 Solve 후 제가 생각한 Logic을 기록하는 개인 공부 블로그입니다.
내용 중 최적화가 가능한 부분등은 언제든지 댓글로 틀린 부분 및 피드백 주시면 공부 및 반영하겠습니다🧐
728x90
반응형
'Algorithm > Beakjoon' 카테고리의 다른 글
[백준/Baekjoon] 11054 가장 긴 바이토닉 부분 수열 C++ :: Dynamic Programming (0) | 2023.12.25 |
---|---|
[백준/Baekjoon] 2580 스도쿠 C++ :: Back tracking & Implementation (0) | 2023.12.25 |
[백준/Baekjoon] 3055 탈출 C++ :: BFS (1) | 2023.12.22 |
[백준/Baekjoon] 3190 뱀 C++ :: Implementation (1) | 2023.12.21 |
[백준/Baekjoon] 20040 사이클 게임 C++ & Java :: Union-find (1) | 2023.12.20 |