swexpert
[swexpert] 5644. 무선 충전 (구현, java)
해랑쓰
2021. 4. 12. 16:59
728x90
반응형
사용자를 2명으로 제한해줘서 그나마 다행인 문제
충전소까지 거리가 닿냐에 따라서 사용할 수 있거나 없거나 하는데 사용하는 충전소를 중복 조합으로 만들어준다.
중복조합이라고 해서 재귀를 돌릴 필요는 없고 충전소 개수만큼 for문을 돌려주면 된다
다른 충전소이면 총 충전량을 더해주고 같은 충전소이면 충전소가 제공하는 양만큼 (충전한 곳이 하나라도 있을 경우 둘 다 거리가 안닿으면 0) 더해준다.
import java.util.ArrayList;
import java.util.Scanner;
class Pos{
int y,x;
public Pos(int y, int x) {
super();
this.y = y;
this.x = x;
}
}
class Charge{
int y,x,c,p;
public Charge(int x, int y, int c, int p) {
super();
this.x = x;
this.y = y;
this.c = c;
this.p = p;
}
}
public class Solution {
static int t;
static int m,a;
static ArrayList<Charge> arr;
static int[] da;
static int[] db;
static int[] xpos= {0,0,1,0,-1};
static int[] ypos= {0,-1,0,1,0};//0상우하좌
static int answer;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
t=sc.nextInt();
for (int tc = 1; tc <=t; tc++) {
arr=new ArrayList<>();//충전소 리스트
m=sc.nextInt();
a=sc.nextInt();
answer=0;
da=new int[m+1];
db=new int[m+1];
for (int i = 1; i <= m; i++) {
da[i]=sc.nextInt();// a방향 방향
}
for (int i = 1; i <= m; i++) {
db[i]=sc.nextInt();//b 진행 방향
}
for (int i = 0; i < a; i++) {//충전기 a개
//충전기 x,y,c,p
arr.add(new Charge(sc.nextInt(),sc.nextInt(),sc.nextInt(),sc.nextInt()));
}
//현재 a좌표, b좌표
Pos pa=new Pos(1,1);
Pos pb=new Pos(10,10);
int[] charge;
for (int i = 0; i <= m; i++) {
//위치 갱신
pa=new Pos(pa.y+ypos[da[i]],pa.x+xpos[da[i]]);
pb=new Pos(pb.y+ypos[db[i]],pb.x+xpos[db[i]]);
//현재 위치에서 최대 충전량
int max=0;
for (int j = 0; j < arr.size(); j++) {//i초에서 모든 충전기에서 충전가능성 본다
for (int k = 0; k < arr.size(); k++) {
//조합. 사용자 2명이 사용하는 충전소 중복 조합
int sum=0;
charge=new int[2];
Charge temp=arr.get(j);//a가 사용하는 충전소
Charge temp2=arr.get(k);//b가 사용하는 충전소
if(Math.abs(pa.x-temp.x)+Math.abs(pa.y-temp.y)<=temp.c) {
charge[0]=temp.p;//사용할 수 있으면 충전량 갱신
}
if(Math.abs(pb.x-temp2.x)+Math.abs(pb.y-temp2.y)<=temp2.c) {
charge[1]=temp2.p;// 사용할 수 있으면 충전량 갱신
}
if(j!=k) {// 다른 충전소 사용하면 그냥 더한다
sum=charge[0]+charge[1];
}else {// 같은 충전소 사용하면 2로 나눌 필요 없음 합하면 그 양이다.
//max를 해주는 이유는 사용할 수 없으면 0이기 때문에
sum=Math.max(charge[0], charge[1]);
}
//최대 충전량 갱신
if(sum>max)max=sum;
}
}
//i초에서의 최대 충전량 갱신해준다
answer+=max;
}
System.out.printf("#%d %d\n",tc,answer);
}
}
}
728x90
반응형