Skip to content

Latest commit

 

History

History
156 lines (130 loc) · 4.27 KB

File metadata and controls

156 lines (130 loc) · 4.27 KB

🔫 싸움땅

난이도: 골드 2
소요 시간: 50분
메모리: 9MB
시간: 101ms

리뷰

  • 문제에 나와있는 순서대로 차근차근 풀면 되는 문제였다.

전체 코드

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main_싸움땅 {

	static final int[] di = { -1, 0, 1, 0 }; // ↑, →, ↓, ←
	static final int[] dj = { 0, 1, 0, -1 };
	static int N, M;
	static PriorityQueue<Integer>[][] map;
	static int[][] players; // 0:i, 1:j, 2: 방향, 3: 능력치 , 4: 총 능력치, 5: 점수
	static int[][] playerMap;

	public static void main(String[] args) throws Exception {
		int K = init();
		while (K-- > 0) {

			for (int m = 1; m <= M; m++) {

				playerMap[players[m][0]][players[m][1]] = 0;

				int ni = players[m][0] + di[players[m][2]];
				int nj = players[m][1] + dj[players[m][2]];
				if (!check(ni, nj)) {
					players[m][2] = players[m][2] > 1 ? players[m][2] - 2 : players[m][2] + 2;
					ni = players[m][0] + di[players[m][2]];
					nj = players[m][1] + dj[players[m][2]];
				}
				players[m][0] = ni;
				players[m][1] = nj;

				if (playerMap[players[m][0]][players[m][1]] == 0) {
					if (map[players[m][0]][players[m][1]].size() > 0) {
						if (players[m][4] > 0) {
							map[players[m][0]][players[m][1]].offer(players[m][4]);
						}
						players[m][4] = map[players[m][0]][players[m][1]].poll();
					}
					playerMap[players[m][0]][players[m][1]] = m;
				} else {

					int u = playerMap[players[m][0]][players[m][1]];
					int me = players[m][3] + players[m][4];
					int you = players[u][3] + players[u][4];

					if (me > you || (me == you && players[m][3] > players[u][3])) {
						players[m][5] += me - you;
						setLoser(u);
						setWinner(m);
					} else {
						players[u][5] += you - me;
						setLoser(m);
						setWinner(u);
					}
				}

			}
		}

		StringBuilder sb = new StringBuilder();
		for (int i = 1; i <= M; i++) {
			sb.append(players[i][5]).append(" ");
		}
		System.out.println(sb);

	}

	static int init() throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		int K = Integer.parseInt(st.nextToken());

		map = new PriorityQueue[N][N];
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < N; j++) {
				int tmp = Integer.parseInt(st.nextToken());
				map[i][j] = new PriorityQueue<>(Comparator.reverseOrder());
				if (tmp > 0) {
					map[i][j].offer(tmp);
				}
			}
		}

		playerMap = new int[N][N];
		players = new int[M + 1][];
		for (int i = 1; i <= M; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			players[i] = new int[] { Integer.parseInt(st.nextToken()) - 1, Integer.parseInt(st.nextToken()) - 1,
					Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), 0, 0 };
			playerMap[players[i][0]][players[i][1]] = i;
		}
		return K;
	}

	static void setLoser(int m) {
		if (players[m][4] > 0) {
			map[players[m][0]][players[m][1]].offer(players[m][4]);
			players[m][4] = 0;
		}

		int ni = players[m][0] + di[players[m][2]];
		int nj = players[m][1] + dj[players[m][2]];
		while (!check(ni, nj) || playerMap[ni][nj] > 0) {
			players[m][2] = (players[m][2] + 1) % 4;
			ni = players[m][0] + di[players[m][2]];
			nj = players[m][1] + dj[players[m][2]];
		}
		players[m][0] = ni;
		players[m][1] = nj;

		if (map[players[m][0]][players[m][1]].size() > 0) {
			players[m][4] = map[players[m][0]][players[m][1]].poll();
		}
		playerMap[players[m][0]][players[m][1]] = m;
	}

	static void setWinner(int m) {
		if (players[m][4] > 0) {
			map[players[m][0]][players[m][1]].offer(players[m][4]);
		}
		if (map[players[m][0]][players[m][1]].size() > 0) {
			players[m][4] = map[players[m][0]][players[m][1]].poll();
		}
		playerMap[players[m][0]][players[m][1]] = m;
	}

	static boolean check(int i, int j) {
		if (i < 0 || i >= N || j < 0 || j >= N)
			return false;
		return true;
	}
}