티스토리 뷰
출처 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRDL1aeugDFAUo
"시뮬레이션"
단순 시뮬레이션 문제로써 각 지점에서 최대 배터리 충전 용량을 구하는 것이다. 여기서 중요한 것은 움직이는 매 순간마다 사용자 A와 B가 어떤 BC를
선택해야 배터리 충전 용량이 최대가 되는지를 판별하는 것이다.
path[2][A] 배열을 만들어서 매 시간마다 사용자 A 와 B 가 접근할 수 있는 모든 BC를 체크 한 후, getMax 라는 함수를 통해 A와 B가 선택 가능한 BC의 모든 조합을 조사해 그중에서 최대 배터리 충전량을 구하는 식으로 문제를 해결했다.
삼성 역량 테스트 문제의 시뮬레이션이 점점 복잡해지는 듯하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Solution { static int T,M,A; static boolean[][] path; static int[][] move; static BC[] bcs; static int ax,ay,bx,by; static int[] dx = {0,0,1,0,-1}; static int[] dy = {0,-1,0,1,0}; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); T = Integer.parseInt(br.readLine()); int t = 1; while(T-- > 0) { StringTokenizer st = new StringTokenizer(br.readLine()); M = Integer.parseInt(st.nextToken()); A = Integer.parseInt(st.nextToken()); path = new boolean [2][A]; bcs = new BC [A]; move = new int [2][M+1]; st = new StringTokenizer(br.readLine()); for (int i = 1; i <= M; i++) { move[0][i] = Integer.parseInt(st.nextToken()); } st = new StringTokenizer(br.readLine()); for (int i = 1; i <= M; i++) { move[1][i] = Integer.parseInt(st.nextToken()); } for (int i = 0; i < A; i++) { st = new StringTokenizer(br.readLine()); int x = Integer.parseInt(st.nextToken()); int y = Integer.parseInt(st.nextToken()); int c = Integer.parseInt(st.nextToken()); int p = Integer.parseInt(st.nextToken()); bcs[i] = new BC(x,y,c,p); } int sum = 0; ax = ay = 1; bx = by = 10; for (int j = 0; j <= M; j++) { int nax = ax + dx[move[0][j]]; int nay = ay + dy[move[0][j]]; int nbx = bx + dx[move[1][j]]; int nby = by + dy[move[1][j]]; Arrays.fill(path[0], false); Arrays.fill(path[1], false); for (int k = 0; k < A; k++) { if(range(nax,nay,bcs[k].x,bcs[k].y) <= bcs[k].c) { path[0][k] = true; } if(range(nbx,nby,bcs[k].x,bcs[k].y) <= bcs[k].c) { path[1][k] = true; } } sum+= getMax(); ax = nax; ay = nay; bx = nbx; by = nby; } System.out.printf("#%d %d%n",t++,sum); } } static int getMax(){ int max = 0; for (int j = 0; j < A; j++) { for (int k = 0; k < A; k++) { int temp = 0; if(path[0][j]) { if(path[1][k]) { temp = j == k ? bcs[k].p : bcs[j].p + bcs[k].p; } else { temp = bcs[j].p; } } else { if(path[1][k]) { temp = bcs[k].p; } } max = Math.max(max, temp); } } return max; } static int range (int x, int y ,int a ,int b) { return Math.abs(x-a) + Math.abs(y-b); } } class BC { int x; int y; int c; int p; BC (int x, int y, int c, int p ) { this.x = x; this.y = y; this.c = c; this.p = p; } } | cs |
'Study > 알고리즘 문제풀이' 카테고리의 다른 글
백준 9177. 단어 섞기 :: 돼지개발자 (0) | 2018.11.08 |
---|---|
백준 2933. 미네랄 :: 돼지개발자 (0) | 2018.11.07 |
백준 1953. 팀배분 :: 돼지개발자 (0) | 2018.11.06 |
백준 3187. 양치기 꿍 :: 돼지개발자 (0) | 2018.11.06 |
백준 1613. 역사 :: 돼지개발자 (0) | 2018.11.05 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday