728x90
시뮬레이션 문제이기 때문에 꼼꼼하게 문제를 읽고 주의 해야 할 점을 정리하는 것이 좋다.
문제이해
시뮬레이션 문제는 이해하기 쉬운 편이다. 특히 SWEA에서 제공하는 모의 SW 역량 테스트는 더더욱 그렇다.
- 상하좌우로 이동한다.
- BC범위 내에 있으면 sum에 더해준다.
- 2명이상의 사용자가 같은 BC를 사용한다면 균등하게 분배한다.
- 사용자가 2개의 BC범위내에 있으면 하나를 선택한다.
주의사항
1. 만약 2명이상의 사용자가 같은 BC를 사용할 수 있는데 다른 사용자가 2개의 BC범위내에 있으면 선택할수 있다.
2. 0부터 충전이 가능하다.
알고리즘
1. 각 시작점에 check함수를 통해 충전량을 확인하고 넣는다. 이휴 반복문을 통해 주어진 이동경로 대로 이동시킨다.
2. 사용자가 BC에 속해있는지 안속해있는지를 판단하는 boolean형태의 배열을 만든다.
3. 사용자가 속한 BC중에 가장 큰 값을 선택한다.
4. 만약 선택한 가장 큰 값이 겹친다면 사용자가 속한 BC중에 가장 큰 조합을 찾는다.
import java.util.Arrays;
import java.util.LinkedList;
///////////////////////////////////////////////////////////////////
import java.util.Scanner;
import java.util.StringTokenizer;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
//import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
class Solution
{
static int map\[\]\[\];
static int A\[\];
static int B\[\];
static int A\_position\[\];
static int B\_position\[\];
static int BC\[\]\[\];
static boolean check\[\]\[\];
static int time;
static int M;
static int dir\[\]\[\] = {{0,0},{-1,0},{1,0},{0,-1},{0,1}};
static int sum;
static int max;
public static void main(String args[]) throws Exception
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(in.readLine());
for (int test_case = 1; test_case <=T; test_case++) {
StringTokenizer s = new StringTokenizer(in.readLine()," ");
map = new int[10][10];
time = Integer.parseInt(s.nextToken()); //시간
M = Integer.parseInt(s.nextToken()); //BC개수
BC = new int[M][4];
A = new int[time];
B = new int[time];
sum=0;
s = new StringTokenizer(in.readLine()," ");
for (int i = 0; i <time ; i++) {
A[i] = Integer.parseInt(s.nextToken());
}
s = new StringTokenizer(in.readLine()," ");
for (int i = 0; i <time ; i++) {
B[i] = Integer.parseInt(s.nextToken());
}
for (int i = 0; i < M; i++) {
s = new StringTokenizer(in.readLine()," ");
for (int j = 0; j <4; j++) {
if(j<2)
BC[i][j] = Integer.parseInt(s.nextToken())-1;
else
BC[i][j] = Integer.parseInt(s.nextToken());
}
}
A_position = new int[2];
B_position = new int[2];
for (int i = 0; i < 2; i++) {
A_position[i] = 0;
B_position[i] = 9;
}
//A가 0,0
//B가 9,9
//0초부터 충전 가능하기 때문에 신경써야함
check(0,0,9,9);
for (int i = 0; i < time; i++) {
switch (A[i])
{
case 0: // 변함없음
break;
case 1: //상
A_position[1] -=1;
break;
case 2: //우
A_position[0] +=1;
break;
case 3://하
A_position[1] +=1;
break;
case 4://좌
A_position[0] -=1;
break;
}
switch (B[i])
{
case 0: // 변함없음
break;
case 1: //상
B_position[1] -=1;
break;
case 2: //우
B_position[0] +=1;
break;
case 3://하
B_position[1] +=1;
break;
case 4://좌
B_position[0] -=1;
break;
}
check(A_position[0],A_position[1],B_position[0],B_position[1]);
//if(A_position[0] > -1 && A_position[1] >-1 &&A_position[0] < 10 && A_position[1] < 10 && B_position[0] > -1 && B_position[1] >-1 &&B_position[0] < 10 &&B_position[1] < 10)
}
System.out.println("#"+test_case+" "+sum);
}
}
private static void check(int A\_x, int A\_y, int B\_x, int B\_y)
{
check = new boolean\[M\]\[2\];
for (int i = 0; i < M; i++)
{
if(Math.abs(A\_x-BC\[i\]\[0\]) +Math.abs(A\_y-BC\[i\]\[1\]) <= BC\[i\]\[2\]) //BC\[i\]\[0\]0이 x이다.
{
check\[i\]\[0\] = true; // 0은 A
}
if(Math.abs(B_x-BC[i][0]) +Math.abs(B_y-BC[i][1]) <= BC[i][2]) //BC[i][0]0이 x이다.
{
check[i][1] = true; // 1은 B
}
}
//System.out.println("A_x = "+A_x+" B_x = "+B_x+" A_y = "+A_y+" B_y = "+B_y);
boolean flag = false;
//만약 checkA하고 checkB가 겹친다면 다른 true가 있는지 살펴보고 없으면 하나만 더해준다.
int max0=0;
int max1=0;
int index0 = -1;
int index1 = -1;
for (int j1 = 0; j1 < M; j1++)
{
if(check[j1][0])
{
if(max0 < BC[j1][3])
{
max0 = BC[j1][3];
index0 = j1;
}
}
if(check[j1][1])
{
if(max1 < BC[j1][3])
{
max1 = BC[j1][3];
index1 = j1;
}
}
}
if((index0 != -1 && index1 != -1) && index1 == index0 ) //겹치는거
{
int dd=0;
for (int j2 = 0; j2 < M; j2++)
{
dd=BC[index0][3];
if(check[j2][1] && index0 != j2)
dd+=BC[j2][3];
if(max < dd)
max = dd;
}
dd=0;
for (int j2 = 0; j2 < M; j2++)
{
dd=BC[index0][3];
if(check[j2][0] && index0 != j2)
dd+=BC[j2][3];
if(max < dd)
max = dd;
}
sum += max;
}
else
sum+=max0+max1;
max=0;
}
}
'코딩테스트 준비하기 > 시뮬레이션 & 자료구조' 카테고리의 다른 글
5650. [모의 SW 역량테스트] 핀볼 게임 (JAVA) (0) | 2020.04.17 |
---|---|
K번째 문자열 (0) | 2020.03.17 |
파핑파핑 지뢰찾기 (0) | 2020.03.17 |
염라대왕 이름 정렬 (0) | 2020.03.12 |
벽돌깨기 (0) | 2020.03.10 |