๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRDL1aeugDFAUo 

 

SW Expert Academy

SW ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”์— ๋„์›€์ด ๋˜๋Š” ๋‹ค์–‘ํ•œ ํ•™์Šต ์ปจํ…์ธ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!

swexpertacademy.com


1. ๋ฌธ์ œ์š”์•ฝ

A๋Š” (1,1) B๋Š” (10,10) ์ขŒํ‘œ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ๋งค ์ดˆ๋งˆ๋‹ค ์ด๋™ํ•˜๋ฉด์„œ, ํ•ด๋‹น ์ขŒํ‘œ๊ฐ€ ์ถฉ์ „ ๋ฒ”์œ„์— ์žˆ์„ ๊ฒฝ์šฐ ๋‘ ์‚ฌ์šฉ์ž๊ฐ€ ์ถฉ์ „ํ•œ ๊ฐ’์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•ด ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

๋‘ ์‚ฌ์šฉ์ž์˜ ์ขŒํ‘œ๊ฐ€ ๊ฐ™์€ ์ถฉ์ „๊ธฐ์˜ ๋ฒ”์œ„ ์•ˆ์— ์žˆ์„ ๊ฒฝ์šฐ, ์ถฉ์ „๊ธฐ์˜ ์ถฉ์ „๋Ÿ‰/2์”ฉ ์ถฉ์ „๋œ๋‹ค. ์ฆ‰, ์ด ์ถฉ์ „๋Ÿ‰์€ ํ•ด๋‹น ์ถฉ์ „๊ธฐ์˜ ์ถฉ์ „๋Ÿ‰๊ณผ ๊ฐ™๋‹ค.

2. ํ’€์ด

1. ๋‘ ์‚ฌ์šฉ์ž์˜ ์‹œ์ž‘์œ„์น˜์—์„œ๋ถ€ํ„ฐ ์ถฉ์ „๋ฒ”์œ„๋ฅผ ์ฒดํฌํ•œ๋‹ค.

2. ๋งค ์ดˆ๋งˆ๋‹ค ๋‘ ์‚ฌ์šฉ์ž์˜ ์ขŒํ‘œ๋ฅผ ์ด๋™์‹œํ‚ค๊ณ , ๊ฐ๊ฐ์˜ ์ขŒํ‘œ์—์„œ ์ถฉ์ „๋ฒ”์œ„๋ฅผ ์ฒดํฌํ•œ๋‹ค. 

  1. ํ•ด๋‹น ์ขŒํ‘œ์—์„œ ์ถฉ์ „ ๊ฐ€๋Šฅํ•œ ์ถฉ์ „๊ธฐ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ๊ฐ์˜ List์— ์ €์žฅํ•œ๋‹ค.
    (์ถฉ์ „๊ธฐ ๋ฒˆํ˜ธ ๋‹น ๋ฒ”์œ„ >= ์ถฉ์ „๊ธฐ์™€ ์ขŒํ‘œ์˜ ๊ฑฐ๋ฆฌ)
    (์—ฌ๋Ÿฌ ์ถฉ์ „๊ธฐ์˜ ๋ฒ”์œ„์— ํ•ด๋‹น๋˜๋Š” ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋‹ด๊ธด๋‹ค.)     
  • ๋‘ ์‚ฌ์šฉ์ž ๋ชจ๋‘ ์ถฉ์ „ ๋ฒ”์œ„์— ์žˆ์„ ๊ฒฝ์šฐ : ๋ชจ๋“  ์กฐํ•ฉ์„ ๋ณธ๋‹ค.
    => ์ถฉ์ „๊ธฐ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™์œผ๋ฉด ์ถฉ์ „๊ธฐ ์ถฉ์ „๋Ÿ‰, ๋‹ค๋ฅด๋ฉด ๋‘ ์ถฉ์ „๊ธฐ ์ถฉ์ „๋Ÿ‰ ํ•ฉ
    => ์กฐํ•ฉ๋งˆ๋‹ค ์ตœ๋Œ€๊ฐ’ ๊ตฌํ•จ
  • A์‚ฌ์šฉ์ž๋งŒ ์ถฉ์ „ ๋ฒ”์œ„์— ์žˆ์„ ๊ฒฝ์šฐ : ListA์— ๋‹ด๊ธด ์ถฉ์ „๊ธฐ ์ถฉ์ „๋Ÿ‰ ์ตœ๋Œ€๊ฐ’
  • B์‚ฌ์šฉ์ž๋งŒ ์ถฉ์ „ ๋ฒ”์œ„์— ์žˆ์„ ๊ฒฝ์šฐ : ListB์— ๋‹ด๊ธด ์ถฉ์ „๊ธฐ ์ถฉ์ „๋Ÿ‰ ์ตœ๋Œ€๊ฐ’

3. ํ•ด๋‹น ์ดˆ์˜ ์ตœ๋Œ€๊ฐ’์ด ๋‚˜์˜ค๋ฉด ๋ˆ„์ ํ•˜์—ฌ ๋”ํ•œ๋‹ค. (๊ฒฐ๊ณผ๊ฐ’ = ์ตœ๋Œ€๊ฐ’์˜ ๋ˆ„์ ํ•ฉ)

3. ์ฝ”๋“œ

๋”๋ณด๊ธฐ
import java.util.*;
import java.io.*;

public class SW_5644_๋ฌด์„ ์ถฉ์ „ {

	static int M, A, res;
	static int[] dirA, dirB;
	static BC[] BC;
	
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		int T = Integer.parseInt(br.readLine());
		
		for (int t = 1; t <= T; t++) {
			st = new StringTokenizer(br.readLine());
			M = Integer.parseInt(st.nextToken());
			A = Integer.parseInt(st.nextToken());
			
			dirA = new int[M];
			dirB = new int[M];
			BC = new BC[A];
			res = 0;
			
			//1. A์ด๋™ ์ •๋ณด ์ €์žฅ
			st = new StringTokenizer(br.readLine());
			for (int m = 0; m < M; m++) {
				dirA[m] = Integer.parseInt(st.nextToken());
			}
			//2. B์ด๋™ ์ •๋ณด ์ €์žฅ
			st = new StringTokenizer(br.readLine());
			for (int m = 0; m < M; m++) {
				dirB[m] = Integer.parseInt(st.nextToken());
			}
			
			//3. BC์ •๋ณด ์ €์žฅ
			for (int a = 0; a < A; a++) {
				st = new StringTokenizer(br.readLine());
				BC[a] = new BC(new Point( Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()) ),
						Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
			} //์ž…๋ ฅ ๋
			
			solution();
			
			System.out.println("#"+t+" "+res);
		}
	}

	static void solution() {
		//1. ์ดˆ๊ธฐ ์ขŒํ‘œ - ์ถฉ์ „ max ์ฐพ๊ธฐ
		Point userA = new Point(1,1);
		Point userB = new Point(10,10);
		charge(userA, userB);
		
		//2. ์›€์ง์ž„ - ์ถฉ์ „ max ์ฐพ๊ธฐ
		for (int i = 0; i < M; i++) {
			move(userA, dirA[i]);
			move(userB, dirB[i]);
			charge(userA, userB);
		}
	}
	
	//๊ทธ ์ดˆ๋งˆ๋‹ค ์ตœ๋Œ€๊ฐ’์„ ๋”ํ•˜๊ณ  ๊ฐ€๋Š”๊ฑฐ์ž„
	static void charge(Point userA, Point userB) {
		//A์™€ B ์œ„์น˜์˜ ์ ‘์† ๊ฐ€๋Šฅํ•œ BC๋ฆฌ์ŠคํŠธ
		List<Integer> ListA = new ArrayList<> ();
		List<Integer> ListB = new ArrayList<> ();
		
		//BC๊ฐœ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต
		for (int i = 0; i < A; i++) {
			//A์ขŒํ‘œ๊ฐ€ ๊ฐ๊ฐ BC ๋ฒ”์œ„ ์•ˆ์—์žˆ๋Š”์ง€ - ์žˆ์œผ๋ฉด ๋ฆฌ์ŠคํŠธ์— add
			if (BC[i].c >= Math.abs( BC[i].point.x - userA.x ) + Math.abs( BC[i].point.y - userA.y ) ) {
				ListA.add(i);
			}
			//B์ขŒํ‘œ๊ฐ€ ๊ฐ๊ฐ BC ๋ฒ”์œ„ ์•ˆ์—์žˆ๋Š”์ง€ - ์žˆ์œผ๋ฉด ๋ฆฌ์ŠคํŠธ์— add
			if (BC[i].c >= Math.abs( BC[i].point.x - userB.x ) + Math.abs( BC[i].point.y - userB.y ) ) {
				ListB.add(i);
			}
		}
		
		int max = 0, tmp = 0;
		
		//1. A,B ๋ชจ๋‘ list์— 1๊ฐœ ์ด์ƒ์ผ ๋•Œ
		if ( ListA.size() >= 1 && ListB.size() >= 1 ) {
			//๋ชจ๋“  ์กฐํ•ฉ์„ ๋ด„
			for (int i : ListA) {
				for (int j : ListB) {
					tmp = 0;
					if (i == j) {
						tmp = BC[i].p;
					} else {
						tmp = (BC[i].p + BC[j].p);
					}
					max = Math.max( max, tmp );
				}
			}
		}
		//2. A list์—๋งŒ 1๊ฐœ ์ด์ƒ์ผ ๋•Œ (B๋Š” BC๋“ค์˜ ๋ฒ”์œ„์— ์—†์„ ๋•Œ)
		else if ( ListA.size() >= 1 && ListB.size() == 0 ) {
			for (int i : ListA) {
				max = Math.max( max, BC[i].p );
			}
		}
		//3. B list์—๋งŒ 1๊ฐœ ์ด์ƒ์ผ ๋•Œ (A๋Š” BC๋“ค์˜ ๋ฒ”์œ„์— ์—†์„ ๋•Œ)
		else if ( ListA.size() == 0 && ListB.size() >= 1 ) {
			for (int i : ListB) {
				max = Math.max( max, BC[i].p );
			}
		}
		res += max;
	}
	

	static void move(Point point, int dir) {
		int[] dy = {0,-1,0,1,0};
		int[] dx = {0,0,1,0,-1};
		//์ขŒํ‘œ ์ด๋™
		point.y += dy[dir];
		point.x += dx[dir];
	}
	
	static class BC {
		Point point;
		int c, p;
		public BC(Point point, int c, int p) {
			this.point = point;
			this.c = c;
			this.p = p;
		}
	}
	
	static class Point {
		int y, x;
		public Point(int x, int y) {
			this.y = y;
			this.x = x;
		}
	}
}