코딩테스트 준비하기/시뮬레이션 & 자료구조

무선 충전

코드 살인마 2020. 3. 8. 01:02
728x90

문제 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRDL1aeugDFAUo&categoryId=AWXRDL1aeugDFAUo&categoryType=CODE&&&

 

SW Expert Academy

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

swexpertacademy.com

시뮬레이션 문제이기 때문에 꼼꼼하게 문제를 읽고 주의 해야 할 점을 정리하는 것이 좋다.

문제이해

시뮬레이션 문제는 이해하기 쉬운 편이다. 특히 SWEA에서 제공하는 모의 SW 역량 테스트는 더더욱 그렇다.

  1. 상하좌우로 이동한다.
  2. BC범위 내에 있으면 sum에 더해준다.
  3. 2명이상의 사용자가 같은 BC를 사용한다면 균등하게 분배한다.
  4. 사용자가 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