반응형
문제
https://www.acmicpc.net/problem/14499
접근방법
1) 접근 사고
주사위를 돌리는 구현을 구현해주는게 핵심이었습니다. 주사위가 이동방향으로 움직였을때 표현을 이동방향에 맞게 내부값들을 이동시켜주었습니다.
2) 시간 복잡도
n의 범위가 크지 않아 N^2으로도 탐색이 가능합니다.
3) 배운 점
기능마다 나눠서 객체지향적(?)으로 구현해보았습니다.
4) PS
정답 코드
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
|
#include<bits/stdc++.h>
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define pii pair<int,int>
#define mp(X,Y) make_pair(X,Y)
#define mt(X,Y) make_tuple(X,Y)
#define mtt(X,Y,Z) make_tuple(X,Y,Z)
#define ll long long
#define sz(v) (int)(v).size()
using namespace std;
const int MAX = 21;
int board[MAX][MAX];
int height, width, y, x, k;
int moveY[] ={0,0,-1,1};
int moveX[] ={1,-1,0,0};
struct dice
{
int n, m, k;
vector<int> dice_arr; //0으로 초기화 되있는지 확인
pair<int,int> dice_pos;
vector<vector<int>> board;
vector<int> cmd;
dice(int n , int m, int k) : n(n), m(m), k(k), board(n, vector<int>(m)), dice_arr(6), dice_pos({y,x}){}
void init()
{
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> board[i][j];
}
}
for(int i = 0; i < k; i++){
int tmp;
cin >> tmp;
cmd.push_back(tmp - 1);
}
}
void checkbottom(int bottom)
{
if(!board[dice_pos.first][dice_pos.second])
board[dice_pos.first][dice_pos.second] = dice_arr[bottom];
else{
dice_arr[bottom] = board[dice_pos.first][dice_pos.second];
board[dice_pos.first][dice_pos.second] = 0;
}
}
void move()
{
for(int i = 0 ; i < cmd.size(); i++)
{
if(cmd[i] == 0) // 동
{
dice_pos.first += moveY[cmd[i]];
dice_pos.second += moveX[cmd[i]];
if (dice_pos.first < 0 || dice_pos.first >= n || dice_pos.second < 0 || dice_pos.second >= m)
{
dice_pos.first -= moveY[cmd[i]];
dice_pos.second -= moveX[cmd[i]];
continue;
}
int tmp = dice_arr[5];
dice_arr[5] = dice_arr[1];
dice_arr[1] = dice_arr[4];
dice_arr[4] = dice_arr[3];
dice_arr[3] = tmp;
checkbottom(3);
}
else if(cmd[i] == 1)// 서
{
dice_pos.first += moveY[cmd[i]];
dice_pos.second += moveX[cmd[i]];
if (dice_pos.first < 0 || dice_pos.first >= n || dice_pos.second < 0 || dice_pos.second >= m)
{
dice_pos.first -= moveY[cmd[i]];
dice_pos.second -= moveX[cmd[i]];
continue;
}
int tmp = dice_arr[3];
dice_arr[3] = dice_arr[4];
dice_arr[4] = dice_arr[1];
dice_arr[1] = dice_arr[5];
dice_arr[5] = tmp;
checkbottom(3);
}
else if(cmd[i] == 2)// 남
{
dice_pos.first += moveY[cmd[i]];
dice_pos.second += moveX[cmd[i]];
if (dice_pos.first < 0 || dice_pos.first >= n || dice_pos.second < 0 || dice_pos.second >= m)
{
dice_pos.first -= moveY[cmd[i]];
dice_pos.second -= moveX[cmd[i]];
continue;
}
int tmp = dice_arr[0];
dice_arr[0] = dice_arr[1];
dice_arr[1] = dice_arr[2];
dice_arr[2] = dice_arr[3];
dice_arr[3] = tmp;
checkbottom(3);
}
else//북
{
dice_pos.first += moveY[cmd[i]];
dice_pos.second += moveX[cmd[i]];
if (dice_pos.first < 0 || dice_pos.first >= n || dice_pos.second < 0 || dice_pos.second >= m)
{
dice_pos.first -= moveY[cmd[i]];
dice_pos.second -= moveX[cmd[i]];
continue;
}
int tmp = dice_arr[1];
dice_arr[1] = dice_arr[0];
dice_arr[0] = dice_arr[3];
dice_arr[3] = dice_arr[2];
dice_arr[2] = tmp;
checkbottom(3);
}
// for(int i= 0; i < 6; i++)
// cout << dice_arr[i] <<" ";
// cout <<"\n";
cout << dice_arr[1] <<"\n";
}
}
};
int main(void)
{
fastio;
cin >> height >> width >> y >> x >> k;
dice D(height, width, k);
D.init();
D.move();
}
|
cs |
반응형
'백준문제풀이 > 구현' 카테고리의 다른 글
14503번-로봇청소기 (0) | 2021.09.04 |
---|---|
14502번-연구소 (0) | 2021.09.03 |
14500번-테트로미노 (0) | 2021.09.03 |
13458번-시험감독 (0) | 2021.09.02 |
3190번-뱀 (0) | 2021.08.31 |