[백준/Baekjoon] 20056 마법사 상어와 파이어볼 C++ :: Implementation

2023. 12. 23. 18:00· Algorithm/Beakjoon
목차
  1. 1. Logic
  2. 2. Code
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
  1. 1. Logic
  2. 2. Code
'Algorithm/Beakjoon' 카테고리의 다른 글
  • [백준/Baekjoon] 11054 가장 긴 바이토닉 부분 수열 C++ :: Dynamic Programming
  • [백준/Baekjoon] 2580 스도쿠 C++ :: Back tracking & Implementation
  • [백준/Baekjoon] 3055 탈출 C++ :: BFS
  • [백준/Baekjoon] 3190 뱀 C++ :: Implementation
보글보글소다
보글보글소다
반응형
보글보글소다
Conquer Mind, Conquer All
보글보글소다
전체
오늘
어제
  • 분류 전체보기
    • Algorithm
      • Beakjoon
      • Programmers
    • Frontend
      • React.js
      • JavaScript
    • Backend
      • Java
      • Spring
      • Node.js
    • Design Pattern
    • Computer Science
      • Algorithm
      • 컴퓨터구조
      • 운영체제
      • 네트워크
      • 데이터베이스
      • 자료구조
    • Projects
      • 식단 짜주는 웹
    • 정보보호병
      • Study In military
      • 정보보호병
    • 인공지능
      • 논문 리뷰

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 관리
  • 글쓰기

공지사항

인기 글

태그

  • 이분탐색
  • 구현
  • Algorithm
  • BaekJoon
  • spring
  • 코딩테스트
  • 자료구조
  • 백엔드
  • 프로그래머스
  • 백준 풀이
  • 동적계획법
  • 스프링
  • 알고리즘
  • 알고리즘 풀이
  • Programmers
  • 백준
  • BFS
  • 그래프
  • 운영체제
  • DP

최근 댓글

최근 글

250x250
hELLO · Designed By 정상우.v4.2.2
보글보글소다
[백준/Baekjoon] 20056 마법사 상어와 파이어볼 C++ :: Implementation
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.