반응형
풀이
문제에 나온대로 차례로 처리하면서 풀면되는 문제입니다.
입력을 모두 받은 후에 현위치 부터 그 위치에서 충전 가능한 A와 B의 합의 최대값을 구합니다.
그리고 입력 받은 대로 다음 위치로 이동시키면서 매 위치마다 최대 충전 값을 구해야 합니다.
최대 충전을 구하는 것은 함수를 새로 생성해서 구현했습니다.
- 현 위치와 각각의 충전기위 위치와의 거리를 확인하고 충전기가 커버 가능한 거리에 있으면 A와 B각각에 대해 배열을 하나 생성해 해당 충전기로 충전이 가능하다는 표시를 해줍니다. 또한 충전 가능한 충전기의 수를 A, B 각각에 대해 세줍니다.
- 만약 A와 B모두 충전이 불가능하다면 그대로 반환합니다.
- A 또는 B만 가능하다면 A 또는 B를 충전 할 수 있는 충전기중 performance가 최대인 값을 찾아서 answer에 더해줍니다.
- 둘 다 가능하다면 각각의 충전기에 대해 모두 확인하며 최대 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 |