일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- dfs
- 카카오 공채
- Java
- map
- 삼성 SW 역량테스트
- 프로그래머스
- 젠킨스
- gradle
- 2019 카카오 개발자 겨울 인턴십 코딩테스트
- 2018 카카오
- 2020 KAKAO BLIND RECRUITMENT
- 카카오
- 자바
- 2018 카카오 공채
- 비트마스크
- 삼성 SW 기출문제
- 2020 카카오 공채
- 2019 KAKAO BLIND RECRUITMENT
- 2018 KAKAO BLIND RECRUITMENT 1차
- 2019 카카오 공채
- 알고리즘
- 2018 KAKAO BLIND RECRUITMENT
- c++
- 백준
- bfs
- gcp
- set
- 부스트코스
- Baekjoon
- CS 스터디
Archives
- Today
- Total
아무코딩
[백준 17070] 파이프 옮기기1 (java) 본문
문제풀이
카카오에 블록이동과 비슷한것 같지만 다른 문제입니다. 그때는 기준을 왼쪽 위(목적지와 상대적으로 가까운 지점)를 기준으로 잡았지만 이번에는 목적지와 상대적으로 가까운 지점을 기준으로 잡습니다.
그리고 현재 방향, 다음 방향을 모두 고려하여 불가능한 케이스를 제거해주고, 다음 위치의 벽유무, 범위 체크등을 해주며 dfs를 진행해 주면 되는 문제입니다.
소스코드
더보기
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
|
import java.util.Scanner;
public class Baekjoon17070 {
static int mapSize;
static final int VERTICAL=0;
static final int HORIZONTAL=1;
static final int DIAGONAL=2;
static int[][] map;
static int cnt =0;
public static boolean isPossible(int row,int col, int dir, int nextDir){
if(row>mapSize || col>mapSize)
return false;
if(nextDir==DIAGONAL){
if(row+1>mapSize || col +1>mapSize)
return false;
if(map[row+1][col]==0 && map[row][col+1]==0 && map[row+1][col+1]==0)
return true;
return false;
}else if(nextDir==VERTICAL){
if(col+1>mapSize)
return false;
if(map[row][col+1]==0)
return true;
return false;
}else{//HORIZONTAL
if(row+1>mapSize)
return false;
if(map[row+1][col]==0)
return true;
return false;
}
}
public static void dfs(int row,int col,int dir){
if(row ==mapSize && col == mapSize){
cnt++;
return;
}
for(int i=0;i<3;i++){
if(dir==VERTICAL && i==HORIZONTAL)
continue;
if(dir==HORIZONTAL && i==VERTICAL)
continue;
if(isPossible(row,col,dir,i)){
if(i==DIAGONAL)
dfs(row+1,col+1,i);
else if(i==VERTICAL)
dfs(row,col+1,i);
else{
dfs(row+1,col,i);
}
}
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
mapSize = scan.nextInt();
map = new int[mapSize+1][mapSize+1];
for(int i=1;i<=mapSize;i++){
for(int j=1;j<=mapSize;j++){
map[i][j] = scan.nextInt();
}
}
dfs(1,2,VERTICAL);
System.out.println(cnt);
}
}
|
cs |
문제 링크 : www.acmicpc.net/problem/17070
'알고리즘 > 백준' 카테고리의 다른 글
[백준 1484] 다이어트 (c++) (0) | 2020.05.20 |
---|---|
[백준 2931] 가스관(java) (0) | 2020.05.20 |
[백준 2623] 음악프로그램 (java) (0) | 2020.05.18 |
[백준 2352] 반도체 설계 (0) | 2020.05.15 |
[백준 17281] 야구 (0) | 2020.05.12 |
Comments