-
[백준] 20056 마법사 상어와 파이어볼ALGORITHM/BOJ 2021. 4. 6. 22:30
2021-04-06
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.*;public class Main20056 {static class Ball {int r;int c;int m;int s;int d;public Ball(int r, int c, int m, int s, int d) {this.r = r;this.c = c;this.m = m;this.s = s;this.d = d;}}public static LinkedList<Ball>[][] list;public static Queue<Ball> q;public static int N, M, K, answer;public static int[] dx = {-1, -1, 0, 1, 1, 1, 0, -1};public static int[] dy = {0, 1, 1, 1, 0, -1, -1, -1};public static void move() {int size = q.size();while(size > 0) {Ball b = q.poll();assert b != null;int r = b.r;int c = b.c;int m = b.m;int s = b.s;int d = b.d;// 이동 좌표 계산 - 연결되어 있음r += (dx[d] * (s % N));c += (dy[d] * (s % N));r = (r < 0) ? N+r : r;c = (c < 0) ? N+c : c;r = (r >= N) ? r-N : r;c = (c >= N) ? c-N : c;q.add(new Ball(r, c, m, s, d)); // q에 현재 파이어볼 정보 담기size--;}}public static void merge() {answer = 0;while(!q.isEmpty()) {Ball b = q.poll();int r = b.r;int c = b.c;int m = b.m;int s = b.s;int d = b.d;list[r][c].add(new Ball(r, c, m, s, d)); // q에 있는 것들 list 좌표 값에 맞춰서 옮기기}for(int i = 0; i < N; i++) {for(int j = 0; j < N; j++) {int size = list[i][j].size();if(size > 1) { // 해당 좌표에 2개 이상의 파이어볼이 있다면int mass = 0;int speed = 0;List<Integer> dir = new ArrayList<>();for(int k = 0; k < list[i][j].size(); k++) {Ball b = list[i][j].get(k);mass += b.m; // 질량 합speed += b.s; // 속도 합dir.add(b.d); // dir 임시저장}mass /= 5;speed /= size;int base = dir.get(0) % 2; // dir 첫 번째 기준으로int flag = 0; // 같으면 짝수// dirif(mass > 0) {// 짝수 / 홀수가 다르면for(int p = 1; p < dir.size(); p++) {if(dir.get(p) % 2 != base) { // 하나라도 다르면 홀수flag = 1;break;}}for(int p = flag; p < 8; p+=2) { // 짝/홀 시작q.add(new Ball(i, j, mass, speed, p));}}} else if(size == 1) { // 해당 좌표에 값이 하나밖에 없는 경우 그냥 queue에 넣어q.add(new Ball(i, j, list[i][j].get(0).m, list[i][j].get(0).s, list[i][j].get(0).d));}}}Queue<Ball> temp = new LinkedList<>(q); // q 복사while(!temp.isEmpty()) {Ball b = temp.poll();answer += b.m;}}public static void init() {for(int i = 0; i < N; i++)for(int j = 0; j < N; j++)list[i][j] = new LinkedList<>();}public static void main(String[] args) throws Exception {BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));StringTokenizer st = new StringTokenizer(bf.readLine());N = Integer.parseInt(st.nextToken());M = Integer.parseInt(st.nextToken());K = Integer.parseInt(st.nextToken());list = new LinkedList[N][N];q = new LinkedList<>();answer = 0;init();for(int i = 0; i < M; i++) {st = new StringTokenizer(bf.readLine());int r = Integer.parseInt(st.nextToken()) - 1;int c = Integer.parseInt(st.nextToken()) - 1;int m = Integer.parseInt(st.nextToken());int s = Integer.parseInt(st.nextToken());int d = Integer.parseInt(st.nextToken());q.add(new Ball(r, c, m, s, d));}for(int i = 0; i < K; i++) {move(); // 이동merge(); // 합치고 나누고 ...init(); // 좌표에 list 초기화}System.out.println(answer);}}cs #문제풀이
주석으로 풀이를 썼다.
문제만 잘 읽어서 순서대로 구현하면 깔끔하고 어렵지 않게 구현할 수 있는 문제인데,,,
스스로 더럽게 만들었다,,, queue와 linkedlist 2개 따로 하지 않아도 되는데, 괜히 배열 두 번 안돌겠다고 하다가 이상한데서 헤매기만 했다;'ALGORITHM > BOJ' 카테고리의 다른 글
[백준] 12851 숨바꼭질 2 (0) 2021.06.27 [백준] N과 M (시리즈) (0) 2021.04.21 [백준] 17779 게리맨더링2 (0) 2021.03.29 [백준] 2623 음악프로그램 (0) 2021.02.23 [백준] 2110 공유기 설치 (0) 2021.02.23