์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- PriorityQueue
- Floyd
- ์๋ฃ๊ตฌ์กฐ
- Dijkstra
- ํธ๋ผ์ด
- ์๋ฎฌ๋ ์ด์
- ์ฐ์ ์์ํ
- upperbound
- dp
- ๋ถ๋ถ์งํฉ
- ๊ตฌํ
- ํ์๊ฐ์
- ์นด์นด์ค
- Union Find
- ๋ค์ต์คํธ๋ผ
- LowerBound
- ํ๋ก์ด๋์์
- dfs
- ํฌํฌ์ธํฐ
- ์์ด
- Django
- ๋นํธ๋ง์คํน
- ๊ทธ๋ฆฌ๋
- ์กฐํฉ
- ์ฌ๊ท
- BFS
- ๋ฐฑํธ๋ํน
- ์ธ๊ทธ๋จผํธํธ๋ฆฌ
- ์ด๋ถํ์
- ์ด์งํธ๋ฆฌ
- Today
- Total
J
[JAVA] BOJ ๋ฐฑ์ค 15685 ๋๋๊ณค ์ปค๋ธ ๋ณธ๋ฌธ
[JAVA] BOJ ๋ฐฑ์ค 15685 ๋๋๊ณค ์ปค๋ธ
snowball๐ฐ 2023. 2. 25. 18:44https://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์ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ
- ์ฌ๊ท ํธ์ถํด ์ง์ ์ธ๋๋ฅผ ๊ทธ๋ ค์ค๋ค.
- ๋์ ์ ๋ฐ์์์ ์ถ๊ฐ๋ ์ ๋ค์ ๋ฃ์ด์ค ArrayDeque์ ์ ์ธํ๋ค.
- dot์ ์๋ ์ ๋ค์ ์กฐ์ฌํ์ฌ 90๋ ํ์ ํ ์ ๋ค์ add์ ๋ฃ์ด์ค๋ค. (์ด๊ฒ์ ์ง์ ๊ทธ๋ ค๋ณด๋ฉด์ ์ด๋ป๊ฒ 90๋ ํ์ ํ ์ ์ ๊ตฌํ ์ง ๊ณ ๋ฏผํด๋ณด์!)
- add์ ์๋ ์ ๋ค์ ๋์ ๋ถํฐ ๋ฃ์ด์ค๋ค! ( ๋ค์ ์ธ๋์์ ํธํ๊ฒ ๋์ ์ ๋ฝ์์ ์๋๋ก!)
add์์ ๋ง์ง๋ง ์ ์ ๊ฐ์ ธ์จ ๊ฒ์ ๋ณ ์๋ฏธ ์๋ค.. ์์ด๋ ๋๋ค.
'๐ Problem Solving > ๐ป Samsung SW Expert' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] BOJ ๋ฐฑ์ค 19237 ์ด๋ฅธ ์์ด (0) | 2023.03.06 |
---|---|
[JAVA] BOJ ๋ฐฑ์ค 20061 ๋ชจ๋ ธ๋ฏธ๋ ธ๋๋ฏธ๋ ธ 2 (1) | 2023.03.05 |
[JAVA] BOJ ๋ฐฑ์ค 14890 ๊ฒฝ์ฌ๋ก (0) | 2023.02.18 |
[JAVA] BOJ ๋ฐฑ์ค 17779 ๊ฒ๋ฆฌ๋ฉ๋๋ง2 (0) | 2023.02.17 |
[JAVA] BOJ ๋ฐฑ์ค 17144 ๋ฏธ์ธ๋จผ์ง ์๋ ! (0) | 2023.02.17 |