[구현] 백준 14499 주사위 굴리기
2021. 3. 24. 16:27ㆍ알고리즘 문제분석
수행 시간 : 1시간 50분
1시간 동안 삽질 후 나머지 50분만에 구현성공 한 삼성 sw기출 문제다 난이도는 골드5.. 하지만 알골문제를 풀면서 느끼는 건데 삼성 기출 문제는 일반 문제에 비해 난이도가 높다.. 체감상 골드 3~4 구현 푸는 느낌이랄까..
이 문제에서 가장 핵심은 주사위를 저장하는 배열을 선언해주고 사실상 우리가 필요한 건 1번면과 6번면이므로 1번과 6번을 저장해주는 임시배열을 만들어준다는 느낌으로 풀면 쉽게풀린다. 처음에 삽질할때는 주사위의 전개도를 좌표로 구현해야되나? 라는 생각으로 하드코딩했었는데, 결국 아이디어를 생각해내서 구현성공한 문제이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, m, x, y, k;
vector <int> K;
vector <vector<int>> map;
int dx[4] = { 0,0,-1,1 };
int dy[4] = { 1,-1,0,0 };
int dice[7];
vector <int> ans;
void sol() {
for (int i = 0; i < k;i++) {
x += dx[K[i] - 1]; // -1해준이유 : dx의 인덱스는 0~3, but K의 인덱스는 1~4 값 사이
y += dy[K[i] - 1];
if (x >= 0 && x < n && y >= 0 && y < m) {
int temp[7];
copy(dice, dice + 7, temp);
if (K[i] == 1) { // 동쪽
dice[1] = temp[4];
dice[3] = temp[1];
dice[4] = temp[6];
dice[6] = temp[3];
}
else if (K[i] == 2) { //서쪽
dice[1] = temp[3];
dice[3] = temp[6];
dice[4] = temp[1];
dice[6] = temp[4];
}
else if (K[i] == 3) { // 북쪽
dice[1] = temp[5];
dice[2] = temp[1];
dice[5] = temp[6];
dice[6] = temp[2];
}
else if (K[i] == 4) { //남쪽
dice[1] = temp[2];
dice[2] = temp[6];
dice[5] = temp[1];
dice[6] = temp[5];
}
if (map[x][y] == 0) {
map[x][y] = dice[6];
}
else {
dice[6] = map[x][y];
map[x][y] = 0;
}
ans.push_back(dice[1]);
}
else { //범위 벗어나면 명령 무시하고 제자리
x -= dx[K[i] - 1];
y -= dy[K[i] - 1];
}
}
}
int main() {
cin >> n >> m >> x >> y >> k;
map.resize(n, vector<int>(m, 0));
K.resize(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 >> K[i];
}
sol();
int size = ans.size();
for (int i = 0;i < size;i++) {
cout << ans[i] << "\n";
}
}
'알고리즘 문제분석' 카테고리의 다른 글
[BFS & 완전탐색] 백준 14502 연구소 (0) | 2021.03.27 |
---|---|
[BFS] 백준 5014 스타트링크 (0) | 2021.03.27 |
[BFS&완전탐색] 백준 2468 안전 영역 (0) | 2021.03.19 |
[BFS] 백준 1697 숨바꼭질 (0) | 2021.03.16 |
[구현] 백준 17144 미세먼지 안녕! (0) | 2021.03.16 |