Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 17472
- enum
- 프림알고리즘
- nextInt
- 최소신장트리
- Final
- Encapsulation
- 상속
- abstract
- 객체 지향
- Scanner
- 와일드카드
- 객체지향
- 버퍼비우기
- 인터페이스
- polymorphism
- 다형성
- java
- 제네릭
- 캡슐화
- 내부 클래스
- 추상화
- python
- 백준
- this
- 추상 클래스
- 열거형
- inheritance
- 생성자
Archives
- Today
- Total
쫑쫑이의 블로그
백준 17070 파이프 옮기기 1 Java [DFS] 본문
https://www.acmicpc.net/problem/17070
17070번: 파이프 옮기기 1
유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의
www.acmicpc.net
공통적으로 대각선 체크(오른쪽, 아래, 대각선 오른쪽아래 모두 0인지)해주고
가로와 대각선일때 가로 체크(오른쪽 0인지),
세로와 대각선일때 세로 체크(아래 0인지)해서
dfs로 탐색해서 N,N에 도달하면 카운트해준다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int[][] temps;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
temps = new int[N][];
Stack<int[]> stack = new Stack<>();
stack.add(new int[]{0, 0, 1});
int cnt = 0;
for (int n = 0; n < N; n++) {
temps[n] = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
}
while (!stack.isEmpty()) {
int[] arr = stack.pop();
if (arr[1] == N - 1 && arr[2] == N - 1) cnt++;
else {
if (isRange(arr[1], arr[2], N) && isBlock(2, arr)) stack.add(new int[]{2,arr[1]+1,arr[2]+1});
if ((arr[0] == 0 || arr[0] == 2) && isRange(arr[2], N) && isBlock(0, arr)) stack.add(new int[]{0, arr[1], arr[2] + 1});
if ((arr[0] == 1 || arr[0] == 2) && isRange(arr[1], N) && isBlock(1, arr)) stack.add(new int[]{1, arr[1] + 1, arr[2]});
}
}
System.out.println(cnt);
}
static boolean isRange(int value, int num) {
return (value < num - 1) ? true : false;
}
static boolean isRange(int value1, int value2, int num) {
return (value1 < num - 1 && value2 < num - 1) ? true : false;
}
static boolean isBlock(int arrow, int[] arr) {
if (arrow == 0) return temps[arr[1]][arr[2]+1] == 0 ? true : false;
else if (arrow == 1) return temps[arr[1]+1][arr[2]] == 0 ? true : false;
else return (temps[arr[1]][arr[2]+1] == 0 && temps[arr[1]+1][arr[2]] == 0 && temps[arr[1]+1][arr[2]+1] == 0) ? true : false;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 1967 트리의 지름 Java [트리, DFS] (0) | 2022.10.07 |
---|---|
백준 1167 트리의 지름 Java [트리, DFS] (0) | 2022.10.07 |
백준 2263 트리의 순회 Java [트리 순회] (0) | 2022.10.07 |
백준 1043 거짓말 Java [DFS] (0) | 2022.10.05 |
백준 1149 RGB거리 Java [DP] (0) | 2022.10.05 |