알고리즘/PS - SWEA

[SWEA 5644 - Java] 무선 충전

excited-hyun 2021. 10. 18. 18:05
반응형

 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

풀이

문제에 나온대로 차례로 처리하면서 풀면되는 문제입니다.

입력을 모두 받은 후에 현위치 부터 그 위치에서 충전 가능한 A와 B의 합의 최대값을 구합니다.

그리고 입력 받은 대로 다음 위치로 이동시키면서 매 위치마다 최대 충전 값을 구해야 합니다.

 

최대 충전을 구하는 것은 함수를 새로 생성해서 구현했습니다.

  1. 현 위치와 각각의 충전기위 위치와의 거리를 확인하고 충전기가 커버 가능한 거리에 있으면 A와 B각각에 대해 배열을 하나 생성해 해당 충전기로 충전이 가능하다는 표시를 해줍니다. 또한 충전 가능한 충전기의 수를 A, B 각각에 대해 세줍니다.
  2. 만약 A와 B모두 충전이 불가능하다면 그대로 반환합니다.
  3. A 또는 B만 가능하다면 A 또는 B를 충전 할 수 있는 충전기중 performance가 최대인 값을 찾아서 answer에 더해줍니다.
  4. 둘 다 가능하다면 각각의 충전기에 대해 모두 확인하며 최대 performance를 구합니다. 이때 둘이 동일한 충전기에 의해 충전되는 경우를 반드시 고려해야합니다.
import java.util.Scanner;
import java.util.*;

public class Solution {

	static int M, A;
	static int[] moveA;
	static int[] moveB;
	static Pos[] BC;

	static int[] R = {0, -1, 0, 1, 0};
	static int[] C = {0, 0, 1, 0, -1};

	static int aR = 1;
	static int aC = 1;
	static int bR = 10;
	static int bC = 10;

	static int answer;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int T = sc.nextInt();

		for(int tc = 1; tc<=T; tc++) {
			answer = 0;
			
			M = sc.nextInt();
			A = sc.nextInt();

			moveA = new int[M];
			moveB = new int[M];

			aR = 1;
			aC = 1;
			bR = 10;
			bC = 10;

			for(int i=0; i<M; i++) {
				moveA[i] = sc.nextInt();
			}

			for(int i=0; i<M; i++) {
				moveB[i] = sc.nextInt();
			}

			BC = new Pos[A];

			for(int i=0; i<A; i++) {
				int c = sc.nextInt();
				int r = sc.nextInt();

				int cover = sc.nextInt();
				int perform = sc.nextInt();

				BC[i] = new Pos(r, c, cover, perform);
			}

			charge();
			//움직이면서 충전 
			for(int i=0; i<M; i++) {
				aR += R[moveA[i]];
				aC += C[moveA[i]];
				bR += R[moveB[i]];
				bC += C[moveB[i]];
				charge();
			}
			
			System.out.println("#"+tc+ " "+answer);
		}

	}

	static void charge() {
		int[] canA = new int[A];
		int[] canB = new int[A];
		int cntA = 0, cntB=0;

		for(int i=0; i<A; i++) {
			Pos p = BC[i];

			// A충전 가능 
			if(Math.abs(aR - p.r)+Math.abs(aC-p.c) <= p.cover) {
				canA[i] = 1;
				cntA++;
			}

			// B충전 가능 
			if(Math.abs(bR - p.r)+Math.abs(bC-p.c) <= p.cover) {
				canB[i] = 1;
				cntB++;
			}
		}
		
		int maxC = 0;
		
		//둘 다 충전 불가 
		if(cntA == 0 && cntB == 0) {
			return;
		}
		
		// A만 가능
		if(cntB == 0) {
			maxC = 0;
			for(int i=0; i<A; i++) {
				if(canA[i] == 0)
					continue;
				
				Pos p = BC[i];
				
				if(maxC < p.perform) {
					maxC = p.perform;
				}
			}
			answer+=maxC;
				
			return ;
		}
		
		// B만 가능
		if(cntA == 0) {
			maxC = 0;
			for(int i=0; i<A; i++) {
				if(canB[i] == 0)
					continue;
				
				Pos p = BC[i];
				
				if(maxC < p.perform) {
					maxC = p.perform;
				}
			}
			answer+=maxC;
				
			return ;
		}
		
		// 둘다 가능 
		maxC = 0;
		for(int i=0; i<A; i++) {
			
			if(canA[i] == 0)
				continue;
			Pos p1 = BC[i];
			int tempA = p1.perform;
			
			for(int j=0; j<A; j++) {
				if(canB[j] == 0)
					continue;
				Pos p2 = BC[j];
				int tempB = p2.perform;
				
				// 둘이 다른 충전기 
				if(i!=j) {
					if(tempA+tempB >maxC)
						maxC = tempA+tempB;
				}
				// 둘이 같은 충전기 
				else {
					if(tempA > maxC)
						maxC = tempA;
				}
			}
		}
		answer+=maxC;
	}

	static class Pos {
		int r, c, cover, perform;
		Pos(int r, int c, int cover, int perform){
			this.r = r;
			this.c = c;
			this.cover = cover;
			this.perform = perform;
		}
	}

}
728x90
반응형

'알고리즘 > PS - SWEA' 카테고리의 다른 글

[SWEA 5656 - Java] 벽돌 깨기  (0) 2021.10.19
[SWEA 5658 - Java] 보물상자 비밀번호  (0) 2021.10.19
[SWEA 4012 - Java] 요리사  (0) 2021.10.15
[SWEA 5650 - Java] 핀볼 게임  (0) 2021.10.15
[SWEA 1953 - Java] 탈주범 검거  (0) 2021.10.14