https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRDL1aeugDFAUo
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
import java.util.*;
import java.io.*;
public class Solution
{
static class Point{
int x;
int y;
Point(int x, int y){
this.x = x;
this.y = y;
}
}
static int[][] map;
static int[] dx = {0,0,1,0,-1};
static int[] dy = {0,-1,0,1,0};
static int T, M, A;
static int[] personA;
static int[] personB;
static int[][] charger; //충전기번호, 충전범위, 충전량
static Point a, b;
static int charging(Point p, int n){
int cx = charger[n][0];
int cy = charger[n][1];
int d = Math.abs(p.x-cx)+Math.abs(p.y-cy);
if(d<=charger[n][2]) return charger[n][3];
return 0;
}
static int go(){
int ans;
int max = 0;
//a,b가 충전기 하나씩 택함
//해당 위치에서 충전기까지의 거리를 구해서 충전가능한지 확인
//각각 다른거 골랐으면 그냥 더하면 되고
//같은거 골랐으면 max값 (0또는 충전량일테니)
for(int i=1;i<=A;i++){ //a가 고르고
for(int j=1;j<=A;j++){ //b가 고르고
int chargeA = charging(a,i);
int chargeB = charging(b,j);
//충전이 가능하면 충전량을, 불가능하면 0 return
if(i==j){
//같은거 골랐으면
ans = Math.max(chargeA,chargeB);
}
else{
ans = chargeA+chargeB;
}
max = Math.max(ans,max);
}
}
return max;
}
public static void main(String args[]) throws Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
T = Integer.parseInt(br.readLine());
for(int tc=1;tc<=T;tc++){
int answer = 0;
st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken());
A = Integer.parseInt(st.nextToken());
map = new int[11][11];
personA = new int[M];
personB = new int[M];
st = new StringTokenizer(br.readLine());
for(int i=0;i<M;i++){
personA[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for(int i=0;i<M;i++){
personB[i] = Integer.parseInt(st.nextToken());
}
charger = new int[A+1][4];
for(int i=1;i<=A;i++){
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
charger[i][0] = x;
charger[i][1] = y;
charger[i][2] = Integer.parseInt(st.nextToken()); //중전범위
charger[i][3] = Integer.parseInt(st.nextToken()); //충전량
}
a = new Point(1,1);
b = new Point(10,10);
answer = go();
for(int i=0;i<M;i++){
a.x += dx[personA[i]];
a.y += dy[personA[i]];
b.x += dx[personB[i]];
b.y += dy[personB[i]];
answer += go();
}
System.out.println("#"+tc+" "+answer);
}
}
}
A와 B를 이동시키면서 충전기를 선택하고, 선택한 충전기와의 거리가 충전 가능한 거리인지를 계산
- 충전기가 겹치면 둘 중 최대값을 구하면 됨 (어차피 0 또는 충전량이므로)
- 충전기가 겹치지 않으면 두 값을 더한 값
모든 충전기를 고르고 나면 그 turn에 A와 B의 최대 충전 가능한 값이 나옴
M번 돌면서 다 더해주면 정답
처음 위치에서도 충전이 가능하다는 조건을 고려해주어야 함 !
'알고리즘' 카테고리의 다른 글
슬라이딩 윈도우 / 투 포인터 (JAVA) (1) | 2023.04.11 |
---|---|
[SWEA] SWEA 2105 - 디저트 카페 (JAVA) (0) | 2023.04.07 |
[SWEA] SWEA5658 - 보물상자 비밀번호 (JAVA) (0) | 2023.04.03 |
[PGS] 프로그래머스 - N개의 최소공배수 (JAVA) (0) | 2023.03.28 |
[BOJ] 12100번 : 2048(Easy) (JAVA) (0) | 2023.03.16 |