삼성 SW 역량 테스트 기출 문제
주사위가 굴러가는걸 내가 어떻게 아냐고..
라고 처음에 생각했었는데
생각보다 할 만했던 문제였다
삼성 역량평가는 물체가 좌표상에서 움직이는 시뮬레이션 문제가 정말 주된 유형인듯하다
주사위가 굴러가는걸 어떻게 표현할까?
문제에 그려져 있는 주사위 평면도를 보고 풀이방법을 떠올릴 수 있었다.. 저게 없었으면 못풀었을지도
dice[i] 는 i번 면에 적힌 숫자를 의미한다
dice_idx[i]는 i면(윗면, 바닥면, 옆면 등...)에 위치한 dice의 면 번호
- dice_idx[1] : 바닥 면에 mapping된 dice 의 면
- dice_idx[6]: 윗면에 mapping된 dice 의 면
아래 코드의 핵심은 Move 함수이다
주사위의 이동 방향에 따라서 현재 윗 면, 아랫 면 등에 위치한 dice의 면 번호를 갱신해줌!
Move 함수를 실행 시킨 후 현재 윗면의 숫자를 알고 싶으면 dice[dice_idx[6]] 에 있는 숫자를 읽어보면 된다
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
|
#include <bits/stdc++.h>
using namespace std;
int N, M, x, y, K, nowr, nowc;
int Map[21][21];
// 동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4
int Operation[1001];
// 아래면 : 1, 북쪽으로가는면 : 2, 동쪽으로가는면 : 3, 서쪽으로가는면 : 4, 남쪽으로가는면 : 5, 현재윗면 : 6
int dice_idx[7] = {0,1,2,3,4,5,6};
int dice[7];
int dr[5] = {0, 0, 0, -1, 1}, dc[5] = {0, 1, -1, 0, 0};
void Move(int op){
int temp = dice_idx[1];
switch (op){
case 1:
dice_idx[1] = dice_idx[3];
dice_idx[3] = dice_idx[6];
dice_idx[6] = dice_idx[4];
dice_idx[4] = temp;
break;
case 2:
dice_idx[1] = dice_idx[4];
dice_idx[4] = dice_idx[6];
dice_idx[6] = dice_idx[3];
dice_idx[3] = temp;
break;
case 3:
dice_idx[1] = dice_idx[2];
dice_idx[2] = dice_idx[6];
dice_idx[6] = dice_idx[5];
dice_idx[5] = temp;
break;
case 4:
dice_idx[1] = dice_idx[5];
dice_idx[5] = dice_idx[6];
dice_idx[6] = dice_idx[2];
dice_idx[2] = temp;
break;
default: break;
}
}
void solve(){
int r = x;
int c = y;
for(int i = 0; i < K; i++){
int nr = r + dr[Operation[i]];
int nc = c + dc[Operation[i]];
if(nr >= N || nr < 0 || nc >= M || nc < 0) continue;
Move(Operation[i]);
if(Map[nr][nc] == 0){
Map[nr][nc] = dice[dice_idx[1]];
}
else{
dice[dice_idx[1]] = Map[nr][nc];
Map[nr][nc] = 0;
}
cout << dice[dice_idx[6]] << "\n";
r = nr;
c = nc;
}
}
void input(){
cin >> N >> M >> x >> y >> K;
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
cin >> Map[i][j];
}
}
for(int i = 0; i < K; i++){
cin >> Operation[i];
}
}
int main(){
input();
solve();
return 0;
}
|
cs |
시뮬레이션
'Algorithm > BOJ' 카테고리의 다른 글
[백준 1799] 비숍 C++ (0) | 2021.05.12 |
---|---|
[백준 10026] 적록색약 C++ (0) | 2021.05.08 |
[백준 2533] 사회망 서비스(SNS) C++ (0) | 2021.05.06 |
[백준 1949] 우수 마을 C++ (2) | 2021.05.06 |
[백준 15681] 트리와 쿼리 C++ (0) | 2021.05.05 |