삼성 코딩 테스트 기출 - 주사위 굴리기 14499번
14:20 시작 —> 15:41 종료
명령어들을 Queue에 넣고 , 조건문을 통해 이동할 수 있는지 확인하고 , 주사위가 움직일 수 있을 때마다, 값을 swap해주면서 풀었는데, 이런 단순 구현 문제는 너무 오래 걸리는 거 같다. 그나마 한번에 풀어야 빨리 푸는거 같은데, 계속 오타와 하나씩 실수가 겹치면서 더 오래걸리는거 같다.
2시간안에 2문제를 다 풀어야 좋을 텐데, 이러면 1문제 밖에 못풀거 같아서 걱정이다.
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
2초 | 512MB | 6011 | 2139 | 1617 | 37.860% |
문제
크기가 N×M인 지도가 존재한다. 지도의 오른쪽은 동쪽, 위쪽은 북쪽이다. 이 지도의 위에 주사위가 하나 놓여져 있으며, 주사위의 전개도는 아래와 같다. 지도의 좌표는 (r, c)로 나타내며, r는 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수이다.
xxxxxxxxxx
2
4 1 3
5
6
주사위는 지도 위에 윗 면이 1이고, 동쪽을 바라보는 방향이 3인 상태로 놓여져 있으며, 놓여져 있는 곳의 좌표는 (x, y) 이다. 가장 처음에 주사위에는 모든 면에 0이 적혀져 있다.
지도의 각 칸에는 정수가 하나씩 쓰여져 있다. 주사위를 굴렸을 때, 이동한 칸에 써 있는 수가 0이면, 주사위의 바닥면에 써 있는 수가 칸에 복사된다. 0이 아닌 경우에는 칸에 써 있는 수가 주사위의 바닥면으로 복사되며, 칸에 써 있는 수는 0이 된다.
주사위를 놓은 곳의 좌표와 이동시키는 명령이 주어졌을 때, 주사위가 이동했을 때 마다 상단에 써 있는 값을 구하는 프로그램을 작성하시오.
주사위는 지도의 바깥으로 이동시킬 수 없다. 만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안된다.
입력
첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다.
둘째 줄부터 N개의 줄에 지도에 써 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 써 있는 수는 항상 0이다. 지도의 각 칸에 써 있는 수는 10을 넘지 않는 자연수이다.
마지막 줄에는 이동하는 명령이 순서대로 주어진다. 동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4로 주어진다.
출력
이동할 때마다 주사위의 윗 면에 써 있는 수를 출력한다. 만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안된다.
예제 입력 1
xxxxxxxxxx
4 2 0 0 8
0 2
3 4
5 6
7 8
4 4 4 1 3 3 3 2
예제 출력 1
xxxxxxxxxx
0
0
3
0
0
8
6
3
예제 입력 2
xxxxxxxxxx
3 3 1 1 9
1 2 3
4 0 5
6 7 8
1 3 2 2 4 4 1 1 3
예제 출력 2
xxxxxxxxxx
0
0
0
3
0
1
0
6
0
예제 입력 3
xxxxxxxxxx
2 2 0 0 16
0 2
3 4
4 4 4 4 1 1 1 1 3 3 3 3 2 2 2 2
예제 출력 3
xxxxxxxxxx
0
0
0
0
예제 입력 4
xxxxxxxxxx
3 3 0 0 16
0 1 2
3 4 5
6 7 8
4 4 1 1 3 3 2 2 4 4 1 1 3 3 2 2
예제 출력 4
0
0
0
6
0
8
0
2
0
8
0
2
0
8
0
2
소스 코드
xxxxxxxxxx
using namespace std;
int N, M; // N : 세로 , M : 가로
int x, y; // x : 주사위 초기 가로 좌표 , y : 주사위 초기 세로 좌표
int k; // 명령어 갯수
queue<int> q; // 명령어 저장 vector
int map[21][21]; // 지도 2차원 배열
int dice[6]; // [0] : 윗면 , [1] : 밑면 , [2] : 앞 , [3] : 뒤 , [4] : 왼쪽 , [5] : 오른쪽
int dir_y[5] = {0, 0 , 0 , -1, 1}; // [1] : 동 , [2] : 서 , [3] : 북 , [4] : 남
int dir_x[5] = {0, 1 , -1, 0, 0};
void input()
{
cin >> N >> M >> y >> x >> 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++)
{
int tmp;
cin >> tmp;
q.push(tmp);
}
}
void dice_move(int dir)
{
if (dir == 4) // 주사위를 남쪽으로 움직일 때
{
int tmp_0 = dice[0];
dice[0] = dice[3];
dice[3] = dice[1];
dice[1] = dice[2];
dice[2] = tmp_0;
}
else if (dir == 3) // 주사위를 북쪽으로 움직일 때
{
int tmp_0 = dice[0];
dice[0] = dice[2];
dice[2] = dice[1];
dice[1] = dice[3];
dice[3] = tmp_0;
}
else if (dir == 2) // 주사위를 서쪽으로 움직일 때
{
int tmp_0 = dice[0];
dice[0] = dice[5];
dice[5] = dice[1];
dice[1] = dice[4];
dice[4] = tmp_0;
}
else if (dir == 1) // 주사위를 동쪽으로 움직일 때
{
int tmp_0 = dice[0];
dice[0] = dice[4];
dice[4] = dice[1];
dice[1] = dice[5];
dice[5] = tmp_0;
}
}
void BFS()
{
while (1)
{
if (q.empty()) break;
int here_command = q.front();
q.pop();
for (int i = 1; i <= 4; i++)
{
if (i == here_command)
{
int temp_y = y + dir_y[i];
int temp_x = x + dir_x[i];
if (temp_y < 0 || temp_x < 0 || temp_y >= N || temp_x >= M) break;
dice_move(here_command);
if (map[temp_y][temp_x]) // 바닥에 값이 있을 때
{
dice[1] = map[temp_y][temp_x];
map[temp_y][temp_x] = 0;
}
else // 바닥에 값이 없을 때
map[temp_y][temp_x] = dice[1];
y = temp_y;
x = temp_x;
cout << dice[0] << '\n';
}
}
}
}
int main()
{
input();
BFS();
return 0;
}
'알고리즘 > 완전탐색' 카테고리의 다른 글
맥주 마시면서 걸어가기 9205번 (BFS) (1) | 2018.04.09 |
---|---|
삼성 코딩 테스트 기출 - 시험 감독 13458번 (0) | 2018.04.09 |
삼성 코딩 기출 테스트 - 톱니바퀴 14891번 (단순 구현) (0) | 2018.04.06 |
삼성 코딩 기출 테스트 - 경사로 14890번 (단순 구현) (0) | 2018.04.06 |
삼성 코딩 테스트 기출 - 스타트와 링크 14889번 (순열) (0) | 2018.04.05 |