J

[JAVA] BOJ ๋ฐฑ์ค€ 15685 ๋“œ๋ž˜๊ณค ์ปค๋ธŒ ๋ณธ๋ฌธ

๐Ÿ”‘ Problem Solving/๐Ÿ’ป Samsung SW Expert

[JAVA] BOJ ๋ฐฑ์ค€ 15685 ๋“œ๋ž˜๊ณค ์ปค๋ธŒ

snowball๐Ÿฐ 2023. 2. 25. 18:44

https://www.acmicpc.net/problem/15685

 

15685๋ฒˆ: ๋“œ๋ž˜๊ณค ์ปค๋ธŒ

์ฒซ์งธ ์ค„์— ๋“œ๋ž˜๊ณค ์ปค๋ธŒ์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 20)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๋“œ๋ž˜๊ณค ์ปค๋ธŒ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋“œ๋ž˜๊ณค ์ปค๋ธŒ์˜ ์ •๋ณด๋Š” ๋„ค ์ •์ˆ˜ x, y, d, g๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. x์™€ y๋Š” ๋“œ๋ž˜๊ณค ์ปค

www.acmicpc.net

์ด ๋ฌธ์ œ์—์„œ ์กฐ์‹ฌํ•ด์•ผํ•  ๋ถ€๋ถ„์€ ์ •์‚ฌ๊ฐํ˜•์˜ 4 ๊ผญ์ง€์ ์ด ๋ชจ๋‘ ๋“œ๋ž˜๊ณค ์ปค๋ธŒ์— ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋ฉด (์ฆ‰, ๋ชจ๋‘ ์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์ ๋“ค ์ค‘ ํ•˜๋‚˜์ด๋ฉด) ๊ฐœ์ˆ˜๋ฅผ ์„ธ์–ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋‚˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์ƒ์„ฑ๋œ ์ ์„ ๋ชจ๋‘ dot์ด๋ผ๋Š” ArrayDeque์— ๋„ฃ์–ด ๊ด€๋ฆฌํ•œ ๋‹ค์Œ ๋ชจ๋“  ์ ์ด ์ƒ์„ฑ๋œ ํ›„ ์ ์„ ๊ทธ๋ ค์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•˜์˜€๋‹ค! (์‚ฌ์‹ค ๋ฌธ์ œ ํ‘ธ๋Š”๋ฐ ์กฐ์–ธ์„ ์ข€ ์–ป์—ˆ๋‹ค…)

์ด๋•Œ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•ด์•ผํ•  ๋ถ€๋ถ„์€ ์ง์„ ์ด ๊ทธ์–ด์ง€๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ ๋“ค์„ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด

์ด ๋ฌธ์ œ์—์„œ ์กฐ์‹ฌํ•ด์•ผํ•  ๋ถ€๋ถ„์€ ์ •์‚ฌ๊ฐํ˜•์˜ 4 ๊ผญ์ง€์ ์ด ๋ชจ๋‘ ๋“œ๋ž˜๊ณค ์ปค๋ธŒ์— ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋ฉด (์ฆ‰, ๋ชจ๋‘ ์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์ ๋“ค ์ค‘ ํ•˜๋‚˜์ด๋ฉด) ๊ฐœ์ˆ˜๋ฅผ ์„ธ์–ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋‚˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์ƒ์„ฑ๋œ ์ ์„ ๋ชจ๋‘ dot์ด๋ผ๋Š” ArrayDeque์— ๋„ฃ์–ด ๊ด€๋ฆฌํ•œ ๋‹ค์Œ ๋ชจ๋“  ์ ์ด ์ƒ์„ฑ๋œ ํ›„ ์ ์„ ๊ทธ๋ ค์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•˜์˜€๋‹ค! (์‚ฌ์‹ค ๋ฌธ์ œ ํ‘ธ๋Š”๋ฐ ์กฐ์–ธ์„ ์ข€ ์–ป์—ˆ๋‹ค…)

์ด๋•Œ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•ด์•ผํ•  ๋ถ€๋ถ„์€ ์ง์„ ์ด ๊ทธ์–ด์ง€๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ ๋“ค์„ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด

์ด ๊ฒฝ์šฐ (0, 0) → (1, 0) → (1, -1)์˜ ์ˆœ์„œ๋กœ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.

์ „์ฒด ์ฝ”๋“œ

import java.util.*;
import java.io.*;

class Node{
	public int x;
	public int y;
	public int d;
	public Node(int x, int y) {
		this.x = x;
		this.y = y;
	}
	public Node(int x, int y, int d) {
		this(x, y);
		this.d = d;
	}
}
public class Main {
	static int dx[] = {0, -1, 0, 1};
	static int dy[] = {1, 0, -1, 0};
	static int dots[][] = new int[101][101];
	static ArrayDeque<Node> dot;
	static int result;
	public static void main(String[] args) throws Exception{
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int T = Integer.parseInt(bf.readLine());
		int sx[] = {0, 1, 0, 1};
		int sy[] = {0, 0, 1, 1};
		for(int t=0; t<T; t++) {
			StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
			int x = Integer.parseInt(st.nextToken());
			int y = Integer.parseInt(st.nextToken());
			int d = Integer.parseInt(st.nextToken());
			dot = new ArrayDeque<>();
			dragon(Integer.parseInt(st.nextToken()), new Node(y, x, d));
			while(!dot.isEmpty()) {
				Node s = dot.poll();
				dots[s.x][s.y] = 1;
			}
		}
		for(int i= 0; i< 100; i++) {
			f: for(int j=0; j< 100; j++) {
				for(int d= 0; d<4; d++) {
					int nx = i+sx[d]; int ny = j+sy[d];
					if(dots[nx][ny] != 1) continue f;
				}
				result++;
			}
		}
		System.out.println(result);
	}
	
	static void dragon(int gene, Node node){
		if(gene == 0) {
			int nx = node.x + dx[node.d];
			int ny = node.y + dy[node.d];
			dot.add(node);
			dot.add(new Node(nx, ny));
			return;
		}
		dragon(gene-1, node);
		Node n = dot.getLast();
		ArrayDeque<Node> add = new ArrayDeque<>();
		for(Node d : dot) {
			if(d.x == n.x && d.y == n.y) continue;
			int tempx = d.x - n.x;
			int tempy = d.y - n.y;
			add.add(new Node(n.x + tempy, n.y - tempx));
		}
		n = add.getLast();
		while(! add.isEmpty()) {
			Node temp = add.pollLast();
			dot.add(temp);
		}
	}
}

ํ•œ ์ค„ ์”ฉ ์‚ดํŽด๋ณด์ž!

class Node{
	public int x;
	public int y;
	public int d;
	public Node(int x, int y) {
		this.x = x;
		this.y = y;
	}
	public Node(int x, int y, int d) {
		this(x, y);
		this.d = d;
	}
}

node๋ฅผ ํ†ตํ•ด ์ ๋“ค๊ณผ 1์„ธ๋Œ€ ๋“œ๋ž˜๊ณค ์ปค๋ธŒ๋ฅผ ๊ด€๋ฆฌํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ์ž๋ฅผ ๋‘ ๋ถ€๋ฅ˜๋กœ ์ƒ์„ฑํ•ด์ค€๋‹ค.

static int dx[] = {0, -1, 0, 1};
static int dy[] = {1, 0, -1, 0};
static int dots[][] = new int[101][101];
static ArrayDeque<Node> dot;
static int result;

๋“œ๋ž˜๊ณค ์ปค๋ธŒ๋Š” 0~100์„ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— dots ๋ฐฐ์—ด์€ 101๋กœ ์„ ์–ธํ•œ๋‹ค. (๋ฌธ์ œ๋ฅผ ์ฝ์–ด๋ณด๋ฉด 0~100์˜ ์ ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ)

result ๋ณ€์ˆ˜์— ๊ฒฐ๊ณผ๊ฐ’์„ ์ €์žฅํ•ด์ค€๋‹ค.

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(bf.readLine());
int sx[] = {0, 1, 0, 1};
int sy[] = {0, 0, 1, 1};
for(int t=0; t<T; t++) {
	StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
	int x = Integer.parseInt(st.nextToken());
	int y = Integer.parseInt(st.nextToken());
	int d = Integer.parseInt(st.nextToken());
	dot = new ArrayDeque<>();
	dragon(Integer.parseInt(st.nextToken()), new Node(y, x, d));
	while(!dot.isEmpty()) {
		Node s = dot.poll();
		dots[s.x][s.y] = 1;
	}
}

T์— ๋“œ๋ž˜๊ณค ์ปค๋ธŒ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ›์•„์ฃผ๊ณ  ๋“œ๋ž˜๊ณค ์ปค๋ธŒ ์ •๋ณด๋“ค์„ ๋ฐ›์•„ dot์— ์ €์žฅํ•œ ๋’ค ๋“œ๋ž˜๊ณค ์ปค๋ธŒ๋ฅผ ๊ทธ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

๊ทธ ๋’ค ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์ข…๋ฃŒ๋˜๋ฉด dot์˜ ์ ๋“ค์„ ์ด์šฉํ•˜์—ฌ ์ ์„ ๊ทธ๋ ค์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๋“œ๋ž˜๊ณค ์ปค๋ธŒ๋กœ ๋„˜์–ด๊ฐ€์•ผ ํ•œ๋‹ค.

sx, sy ๋ฐฐ์—ด์€ ๋“œ๋ž˜๊ณค ์ปค๋ธŒ์— ๋“ค์–ด๊ฐ€๋Š” ์ •์‚ฌ๊ฐํ˜•์„ ์กฐ์‚ฌํ•  ๋•Œ ์‚ฌ์šฉํ•  ๊ฒƒ์œผ๋กœ ํ•˜๋‚˜์˜ ์ ์„ ๊ธฐ์ค€์œผ๋กœ ํ˜„์žฌ ์œ„์น˜, ์˜ค๋ฅธ์ชฝ, ์•„๋ž˜, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ๋Œ€๊ฐ์„  4 ๋ฐฉํ–ฅ์„ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค.

	for(int i= 0; i< 100; i++) {
		f: for(int j=0; j< 100; j++) {
			for(int d= 0; d<4; d++) {
				int nx = i+sx[d]; int ny = j+sy[d];
				if(dots[nx][ny] != 1) continue f;
			}
			result++;
		}
	}
	System.out.println(result);
}

์ด์ค‘ for๋ฌธ์„ ํ†ตํ•ด ์ ๋“ค์„ ํƒ์ƒ‰ํ•œ๋‹ค. ์ด๋•Œ 4 ๋ฐฉํ–ฅ์˜ ์ ์ค‘ ์–ด๋–ค ๋ฐฉํ–ฅ์ด๋ผ๋„ ์ ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ continue๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ค์Œ ์ ์„ ์กฐ์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— result์— ๋‹ฟ๋Š” ๊ฒƒ์€ 4๋ฐฉํ–ฅ์— ๋ชจ๋‘ ์ ์ด ์กด์žฌํ•  ๋•Œ ๋ฟ์ด๋‹ค.

result๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

static void dragon(int gene, Node node){
	if(gene == 0) {
		int nx = node.x + dx[node.d];
		int ny = node.y + dy[node.d];
		dot.add(node);
		dot.add(new Node(nx, ny));
		return;
	}

dragon ํ•จ์ˆ˜๋Š” 0์„ธ๋Œ€์™€ ๊ทธ ๋‚˜๋จธ์ง€ ์„ธ๋Œ€๋กœ ๋‚˜๋‰œ๋‹ค. ์ด๋•Œ 0์„ธ๋Œ€์˜ ๊ฒฝ์šฐ๋Š” ์‹œ์ž‘์ ๊ณผ ์‹œ์ž‘์ ์˜ ๋ฐฉํ–ฅ์œผ๋กœ ๋‹ค์Œ ์ ์„ dot์— ๋„ฃ์–ด์ค€๋‹ค.

0์„ธ๋Œ€๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์„ธ๋Œ€๋“ค์€ ์ง์ „ ์„ธ๋Œ€์™€ ์ง์ „ ์„ธ๋Œ€๊ฐ€ 90๋„ ํšŒ์ „ํ•œ ๋ชจ์–‘์„ ๋์ ๋ผ๋ฆฌ ์—ฐ๊ฒฐํ•œ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ง์ „ ์„ธ๋Œ€์™€ 90๋„ ํšŒ์ „ํ•œ ๋ชจ์–‘์œผ๋กœ ๋‚˜๋ˆŒ์ˆ˜ ์žˆ๋‹ค. ์ง์ „ ์„ธ๋Œ€๋Š” ์žฌ๊ท€๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ›์•„์˜ค๊ณ  90๋„ ํšŒ์ „ํ•œ ๋ชจ์–‘์€ “๋์ ์„ ๊ธฐ์ค€์œผ๋กœ” 90๋„ ํšŒ์ „ํ•œ ์ ๋“ค์„ ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ์‹์„ ์ด์šฉํ–ˆ๋‹ค.

๊ฒฐ๊ตญ ๊ทธ๋ ค์ฃผ๋Š” ๊ฒƒ์€ 0์„ธ๋Œ€ ๋ฟ์ธ ๊ฒƒ์ด๋‹ค!

์ฝ”๋“œ๋ฅผ ๋งˆ์ € ๋ณด๊ฒ ๋‹ค.

		dragon(gene-1, node);
		Node n = dot.getLast();
		ArrayDeque<Node> add = new ArrayDeque<>();
		for(Node d : dot) {
			if(d.x == n.x && d.y == n.y) continue;
			int tempx = d.x - n.x;
			int tempy = d.y - n.y;
			add.add(new Node(n.x + tempy, n.y - tempx));
		}
		n = add.getLast();
		while(! add.isEmpty()) {
			Node temp = add.pollLast();
			dot.add(temp);
		}
	}
}

0์„ธ๋Œ€๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ

  1. ์žฌ๊ท€ ํ˜ธ์ถœํ•ด ์ง์ „ ์„ธ๋Œ€๋ฅผ ๊ทธ๋ ค์ค€๋‹ค.
  2. ๋์ ์„ ๋ฐ›์•„์™€์„œ ์ถ”๊ฐ€๋  ์ ๋“ค์„ ๋„ฃ์–ด์ค„ ArrayDeque์„ ์„ ์–ธํ•œ๋‹ค.
  3. dot์— ์žˆ๋Š” ์ ๋“ค์„ ์กฐ์‚ฌํ•˜์—ฌ 90๋„ ํšŒ์ „ํ•œ ์ ๋“ค์„ add์— ๋„ฃ์–ด์ค€๋‹ค. (์ด๊ฒƒ์€ ์ง์ ‘ ๊ทธ๋ ค๋ณด๋ฉด์„œ ์–ด๋–ป๊ฒŒ 90๋„ ํšŒ์ „ํ•œ ์ ์„ ๊ตฌํ• ์ง€ ๊ณ ๋ฏผํ•ด๋ณด์ž!)
  4. add์— ์žˆ๋Š” ์ ๋“ค์„ ๋์ ๋ถ€ํ„ฐ ๋„ฃ์–ด์ค€๋‹ค! ( ๋‹ค์Œ ์„ธ๋Œ€์—์„œ ํŽธํ•˜๊ฒŒ ๋์ ์„ ๋ฝ‘์„์ˆ˜ ์žˆ๋„๋ก!)

add์—์„œ ๋งˆ์ง€๋ง‰ ์ ์„ ๊ฐ€์ ธ์˜จ ๊ฒƒ์€ ๋ณ„ ์˜๋ฏธ ์—†๋‹ค.. ์—†์–ด๋„ ๋œ๋‹ค.

Comments