BOJ_G4_20056
๐ [G4_20056] ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด๋ณผ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class BOJ_G4_20056 {
static class ball {
int y;
int x;
int ballM;
int ballS;
int ballD;
// ์ขํ y,x, ์ง๋, ์๋ ฅ, ๋ฐฉํฅ
public ball(int y, int x, int ballM, int ballS, int ballD) {
this.y = y;
this.x = x;
this.ballM = ballM;
this.ballS = ballS;
this.ballD = ballD;
}
}
static int N, M, K, r, c, m, s, d;
// 8๋ฐฉํฅ 0,1,2,3,4,5,6,7
static int[] dx = { 0, 1, 1, 1, 0, -1, -1, -1 };
static int[] dy = { -1, -1, 0, 1, 1, 1, 0, -1 };
static Queue<ball> queue;
static ArrayList<ball>[][] map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
// **** input start ****
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
// ball ์ ์ฅ ํ
queue = new LinkedList<ball>();
// ์ขํ๋ง๋ค ball ์ ์ฅ ๋ฆฌ์คํธ
map = new ArrayList[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
map[i][j] = new ArrayList<>();
}
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine(), " ");
// ์ขํ
r = Integer.parseInt(st.nextToken())-1;
c = Integer.parseInt(st.nextToken())-1;
// ์ง๋
m = Integer.parseInt(st.nextToken());
// ์๋ ฅ
s = Integer.parseInt(st.nextToken());
// ๋ฐฉํฅ
d = Integer.parseInt(st.nextToken());
// queue ์ ์ ์ฅ
queue.add(new ball(r, c, m, s, d));
}
// **** input end ****
// K๋ฒ ๋ฐ๋ณต
while (K > 0) {
int size = queue.size();
for (int i = 0; i < size; i++) {
// ์ขํ ์ด๋ํ๊ธฐ
move();
}
// ์ ์ฒด ๋๋ฉด์ ๊ฒน์น ๊ฒ์ด ์๋ ์๋ ์ฒดํฌ
for (int j = 0; j < N; j++) {
for (int z = 0; z < N; z++) {
// ์์ผ๋ฉด ํต๊ณผ
if (map[j][z].size() == 0)
continue;
// 1๊ฐ ์์ผ๋ฉด ๊ทธ๋ฅ ํ์ ๋ฃ๋๋ค
if (map[j][z].size() == 1) {
queue.add(map[j][z].get(0));
continue;
}
// 2๊ฐ ์ด์์ธ ๊ฒ์ด ์์ผ๋ฉด
else {
int weight = 0;
int speed = 0;
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < map[j][z].size(); i++) {
weight += map[j][z].get(i).ballM;
speed += map[j][z].get(i).ballS;
list.add(map[j][z].get(i).ballD);
}
weight = weight(weight);
speed = speed(speed, map[j][z].size());
int check = check(list);
// ์ง๋์ด 0 ์ด๋ฉด ์์ ๊ธฐ
if (weight == 0)
continue;
// ๋ค ๊ฐ์ผ๋ฉด ์ง์
if (check == 1) {
int idx = 0;
for (int i = 0; i < 4; i++) {
queue.add(new ball(j, z, weight, speed, idx));
idx += 2;
}
}
// ๋ค๋ฅด๋ฉด ํ์
else {
int idx = 1;
for (int i = 0; i < 4; i++) {
queue.add(new ball(j, z, weight, speed, idx));
idx += 2;
}
}
}
}
}
// map ์ด๊ธฐํ
for(int i=0;i<N;i++) {
for(int j=0;j<N;j++) {
map[i][j] = new ArrayList<>();
}
}
K--;
}
int res = 0;
int size = queue.size();
for(int i=0; i<size; i++) {
res += queue.poll().ballM;
}
System.out.println(res);
}// main end
// ์ด๋ํ๋ ๋ฉ์๋
static void move() {
// ์ด๋ํ ball
ball cur = queue.poll();
// ์ด๋
int ny = cur.y + dy[cur.ballD]*(cur.ballS%N);
int nx = cur.x + dx[cur.ballD]*(cur.ballS%N);
ny = (ny + N)%N;
nx = (nx + N)%N;
// list ์ ์ถ๊ฐ
map[ny][nx].add(new ball(ny, nx, cur.ballM, cur.ballS, cur.ballD));
}
// ์ง๋ ๊ตฌํ๋ ๋ฉ์๋
static int weight(int sum) {
return sum / 5;
}
// ์๋ ฅ ๊ตฌํ๋ ๋ฉ์๋
static int speed(int sum, int cnt) {
return sum / cnt;
}
// ๋ฐฉํฅ ์ฒดํฌ - ๋ฐฉํฅ๋ค ๋ชจ๋ ๋ชจ์์ ( ๋ฐฉํฅ ๋ฆฌ์คํธ ๊ฐ์ ธ์์ 1-> ๋ค๊ฐ๋ค , ์ง์ / 2-> ๋ค ์๊ฐ๋ค, ํ์๋ก ๋ฐํ )
static int check(ArrayList<Integer> list) {
int num = 0;
boolean flag = true;
int temp = list.get(0) % 2;
for (int i = 1; i < list.size(); i++) {
// ๋ง์ฝ ๋ชจ๋ ๊ฐ์ ํ์๋ ์ง์๊ฐ ์๋ ๊ฒฝ์ฐ false
if (list.get(i) % 2 != temp)
flag = false;
}
// ๋ง์ฝ ๋ค ๊ฐ์ผ๋ฉด 1, ๋ค ๋ค๋ฅด๋ฉด 2
if (flag)
num = 1;
else
num = 2;
return num;
}
}// class end
๐ค ๋์ ์๊ฐ
์ผ์ฑ SW ์ญ๋ ํ
์คํธ ๊ธฐ์ถ ๋ฌธ์ ์ด๋คโฆ ๋ฌธ์ ๋ต๋คโฆ ํ์คํ ์กฐ๊ฑด๋ ๋ง๊ณ ์๋ฎฌ๋ ์ด์
์ธ๋ฐ ๋ณต์กํ๋ค ใ
ใ
์คํฐ๋์์ ํ์๋๋ฐ ๊ฒฐ๊ตญ ์ฑ๊ณตํ์ง ๋ชปํ๊ณ ์ฐพ์๋ดค๋ค. ๋คํํ ์ ๊ทผ ๋ฐฉ์์ด ๋น์ทํด์ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์๋ค.
๋๋ ํ์ด์ด๋ณผ๋ค์ ์๋ก์ด queue์๋ค๊ฐ ์ ์ฅํ๋ ๊ธฐ์กด queue์ ๊ทธ ์ขํ์ queue์ ํท๊ฐ๋ฆฌ๊ฒ ํด์ ๊ตฌํ์ ์ฑ๊ณตํ์ง ๋ชปํ ๊ฒ ๊ฐ๋ค.
๊ทธ๋์ ์ขํ๋ง๋ค ArrayList๋ฅผ ํตํด ball์ ์ ์ฅํ๋ค.
์ ์ฒด์ ์ธ ๋ฐฉ๋ฒ์ ์ค๋ช
ํด๋ณด๊ฒ ๋ค.
- ๋จผ์ ๋ชจ๋ ์ขํ๋ง๋ค ArrayList๋ฅผ ์์ฑํด ๋๋ค.
- ๊ฐ๋ค์ ์ ๋ ฅ๋ฐ์ queue์ ์ ์ฅํ๋ค. ( ์ด๊ธฐ ํ์ด์ด๋ณผ )
- ํ์ด์ด๋ณผ์ ์ด๋์ํจ๋ค.
- ์ด๋์ํฌ ๋ ์ขํ ๋ฒ์๋ฅผ ๋์ด๊ฐ๋ฉด ๊ณ์ฐ์ ํด์ค๋ค.
- ์ด๋์ํจ ๊ฐ๋ค์ ArrayList์ ์ ์ฅํ๋ค.
- ์ ์ฒด ์ขํ๋ฅผ ๋๋ฉด์ ArrayList.size()๋ฅผ ํ์ธํ๋ฉฐ 2๊ฐ ์ด์์ธ ๊ฒ์ด ์๋์ง ์ฒดํฌํ๋ค.
- ์์ผ๋ฉด ๋ฌธ์ ์ ๋์์๋ ๊ฒ ์ฒ๋ผ ๊ณ์ฐ์ ํด์ค๋ค.
- ์ง๋์ ์ ์ฒด์ง๋ํฉ / 5 ( ์ง๋์ด 0 ์ด๋ฉด ์์ ๊ธฐ )
- ์๋ ฅ์ ์ ์ฒด์๋ ฅํฉ / ํ์ด์ด๋ณผ ๊ฐ์
- ๋ฐฉํฅ์ ๊ณตํต๋ ๋ฐฉํฅ์ด๋ฉด ์ง์, ์๋๋ฉด ํ์
- ๊ณ์ฐํด์ค ํ์ queue์ ๋ฃ์ด์ฃผ๊ณ ArrayList๋ ์ด๊ธฐํ ์์ผ์ค๋ค.
- ์ด ๊ณผ์ ์ K๋ฒ ๋ฐ๋ณตํ๋ค.
- ์ ์ฒด queue๋ฅผ ๋๋ฉด์ ์ง๋ํฉ์ ๊ตฌํด์ค๋ค.