삼성 SW 역량테스트 백준 감시 15683

1. 문제 링크

삼성 SW 역량테스트 백준 감시 15683

2. 컴퓨팅 사고

문제를 살펴보기전에 알아보아야할 것은 내가 구현하는 것들이 올바른 시간내에 들어오는지를 확인해야 합니다.

  • 최악의 경우 카메라는 총 8대이기때문에 4^8 = 65536경우가 나오게 된다.
  • 사무실의 최대 크기 8 * 8에서 감시못하는 공간을 카운트하면 65536 * 64 = 약 400만이
  1. CCTV를 담아줄 클래스 변수를 하나선언합니다.(좌표X,Y,CCTV번호, 현재방향)
  2. 입력시 1~5사이의 CCTV가 입력받게 되면 해당되는 값들을 하나의 리스트에 담아줍니다.
  3. DFS를 수행합니다.
  • 종료조건: 해당 리스트의 사이즈만큼 선택이 되면 종료조건이됩니다.
    해당 맵이 변경되면 안되므로, 모든값들을 copyMap에 담아줍니다.
    모든 리스트의 값들을 뺴내면서 현재점에서 부터 모든값들을 맵에 칠해주게 됩니다. CCTV감시영역을 퍼트리는 과정
  • 방향 체크
    현재 0번째 방향 (dir+1) % 4(방향의 개수로)로 체크가 가능합니다.
    현재 1번째 방향 (dir+2) % 4 ……
    현재 3번째 방향 (dir+3) % 4….

CCTV 값의 타입 1,2,3,4,5에 따라 호출조건을 달리해줍니다. 모든경우의 수를 찾아서 진행합니다.

만약 현재 맵의 값이 6이면 종료시켜줍니다. 벽을 만난것과 같으므로 더이상 칠하는 행동을 멈추는 과정입니다.

방향 갱신, 방향 범위 체크

while(mx >= 0 && mx < n && my >= 0 && my < m) 의 조건에 맞을때 까지만 반복문을 진행해 나갑니다.
그리고 해당 현재 방향에 따라 계속해서
mx += dir[currdir][0]
my += dir[currdir][1]
의 형식대로 값을 갱신해 나갑니다.

3. 소스 코드

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package Samsung.done;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class 주사위굴리기_14499{
static int n,m,x,y,k;
static int[][] map;
static int[][] dir = {{0,1},{0,-1},{-1,0},{1,0}}; // 동서북
static List<Integer> commandList;
static int upCopy; // 1
static int topCopy; // 2
static int rightCopy; // 3
static int leftCopy; // 4
static int bottomCopy; // 5
static int downCopy; // 6

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
x = Integer.parseInt(st.nextToken());
y = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
map = new int[n][m];
commandList = new ArrayList<>();
for(int i=0; i<n; i++){
st = new StringTokenizer(br.readLine());
for(int j=0; j<m; j++){
map[i][j] = Integer.parseInt(st.nextToken());
}
}
st = new StringTokenizer(br.readLine());
for(int i=0; i<k; i++){
commandList.add(Integer.parseInt(st.nextToken()));
}
// 현재 주사위 상태 객체
Dice dice = new Dice(x,y,0,0,0,0,0,0);

// 명령어 대로 주사위를 돌린다.
for (int i = 0; i < commandList.size(); i++) {
int dx = dice.currX;
int dy = dice.currY;
// 현재 주사위 방향
int currDir = commandList.get(i)-1;
int mx = dx + dir[currDir][0];
int my = dy + dir[currDir][1];

// 주사위 이동방향 체크하기
if(isCheckRange(mx,my)) continue;
diceStateSave(dice);
rollDice(dice, currDir);

// 지도가 0일 경우
if(map[mx][my] == 0){
map[mx][my] = dice.down;
}
// 지도가 0이 아닐 경우
else {
dice.down = map[mx][my];
map[mx][my] = 0;
}
System.out.println(dice.up);
dice.currX = mx;
dice.currY = my;
}
}

private static void rollDice(Dice dice, int currDir) {
if(currDir == 0){
dice.right = upCopy;
dice.down = rightCopy;
dice.left = downCopy;
dice.up = leftCopy;
}else if(currDir == 1){
dice.left = upCopy;
dice.down = leftCopy;
dice.right = downCopy;
dice.up = rightCopy;
}else if(currDir == 2){
dice.top = upCopy;
dice.down = topCopy;
dice.bottom = downCopy;
dice.up = bottomCopy;
}else if(currDir == 3){
dice.up = topCopy;
dice.bottom = upCopy;
dice.down = bottomCopy;
dice.top = downCopy;
}
}

private static void diceStateSave(Dice dice) {
upCopy = dice.up;
topCopy = dice.top;
rightCopy = dice.right;
leftCopy = dice.left;
bottomCopy = dice.bottom;
downCopy = dice.down;
}

private static boolean isCheckRange(int mx, int my) {
if(mx < 0 || mx >= n || my < 0 || my >= m) return true;
return false;
}
private static class Dice {
int currX;
int currY;

// 윗면, 아랫면
int up; // 1
int top; // 2
int right; // 3
int left; // 4
int bottom; // 5
int down; // 6

public Dice(int currX, int currY, int up, int top, int right, int left, int bottom, int down) {
this.currX = currX;
this.currY = currY;
this.up = up;
this.top = top;
this.right = right;
this.left = left;
this.bottom = bottom;
this.down = down;
}
}
}