[코드트리 조별과제][삼성 기출] 정육면체 굴리기
2024. 8. 4. 00:21ㆍ알고리즘/코드트리
[코드트리][삼성 기출] 정육면체 굴리기
풀이
삼성 기출 문제입니다. 구현 및 시뮬레이션 문제입니다.
주사위를 굴리는 것이 난해한데, 각 면을 배열로 두고 숫자들을 옮긴다고 생각하면 편합니다.
dice[6] 배열이 있다고 가정합시다. 그리고 dice[0]을 바닥면으로 생각합니다.
주사위가 구르면 옆면이 바닥면이 되고 바닥면은 옆면이 됩니다. 그런데 여기서 면이 움직이는
것이 아니라 숫자가 움직인다고 생각해봅니다. 즉, 주사위는 실제로 구른게 아니고 면의 숫자들을
떼었다 옮겨 붙이는 방식입니다. 그러면 dice[0]의 숫자를 다른 dice[1]에 옮기는 것은 밑바닥에 있던 숫자가 옆면으로 옮기는 것과 같습니다. 반대로 dice[1]의 숫자를 dice[0]으로 옮기면 마치 dice[1]이 아랫면이 된 것과 동일한 효과를 가집니다.
위 논리에 의거하여 주사위를 굴리면서 문제의 나머지 조건을 맞추면 됩니다.
코드
#include<iostream>
// dice[0] 바닥, dice[5] 천장
// 2
// 1 0 4 5
// 3
int dice[6];
int* Bottom = &dice[0];
int* Top = &dice[5];
// 위에서 2번이 바닥이 된다.
// 0-2-5-3
// | | | |
// 2-5-3-0
// 2번 값이 0으로, 5번 값이 2번으로 가는 것과 같다.
void UP()
{
int tmp = dice[0];
dice[0] = dice[2];
dice[2] = dice[5];
dice[5] = dice[3];
dice[3] = tmp;
}
// 위에서 3번이 바닥이 된다.
// 0-2-5-3
// | | | |
// 3-0-2-5
// 3번 값이 0번으로, 0번 값이 2번으로 가는 것과 같다.
void DOWN()
{
int tmp = dice[0];
dice[0] = dice[3];
dice[3] = dice[5];
dice[5] = dice[2];
dice[2] = tmp;
}
// 위에서 1번이 바닥이 된다.
// 0-4-5-1
// | | | |
// 1-0-4-5
// 1번 값이 0번으로, 5번 값이 1번으로 가는 것과 같다.
void LEFT()
{
int tmp = dice[0];
dice[0] = dice[1];
dice[1] = dice[5];
dice[5] = dice[4];
dice[4] = tmp;
}
// 위에서 4번이 바닥이 된다.
// 0-4-5-1
// | | | |
// 4-5-1-0
// 4번 값이 0번으로, 0번 값이 1번으로 가는 것과 같다.
void RIGHT()
{
int tmp = dice[0];
dice[0] = dice[4];
dice[4] = dice[5];
dice[5] = dice[1];
dice[1] = tmp;
}
int board[20][20];
int n, m, k;
void init()
{
for (int y = 0; y < n; y++)
{
for (int x = 0; x < m; x++)
{
std::cin >> board[y][x];
}
}
}
// 동(R), 서(L), 북(U), 남(D)
int dy[] = { 0,0,-1,1 };
int dx[] = { 1,-1,0,0 };
int main(int argc, char** argv)
{
std::ios::sync_with_stdio(false);
std::cin.tie(NULL); std::cout.tie(NULL);
int y, x;
std::cin >> n >> m >> y >> x >> k;
init();
for (int i = 0; i < k; i++)
{
int dir = 0;
std::cin >> dir;
int ny = y + dy[dir - 1];
int nx = x + dx[dir - 1];
if (ny < 0 || ny >= n || nx < 0 || nx >= m)continue;
y = ny;
x = nx;
if (dir == 1) RIGHT();
else if (dir == 2) LEFT();
else if (dir == 3) UP();
else DOWN();
if (board[y][x] == 0) board[y][x] = *Bottom;
else
{
*Bottom = board[y][x];
board[y][x] = 0;
}
std::cout << *Top << '\n';
}
return EXIT_SUCCESS;
}
'알고리즘 > 코드트리' 카테고리의 다른 글
[코드트리 조별과제][삼성 기출] 2개의 사탕 (0) | 2024.08.18 |
---|---|
[코드트리 조별과제][삼성 기출] 방화벽 설치하기 (0) | 2024.08.11 |
[코드트리 조별과제][삼성 기출] 연산자 배치하기 (0) | 2024.07.26 |
[코드트리 조별과제] [실버2] 가장 큰 증가 부분 수열 (0) | 2024.07.20 |