티스토리 뷰
입력
첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다.
둘째 줄부터 N개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다.
마지막 줄에는 이동하는 명령이 순서대로 주어진다. 동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4로 주어진다.
출력
이동할 때마다 주사위의 윗 면에 쓰여 있는 수를 출력한다. 만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안 된다.
[BOJ 14499(G5) 리뷰]
숫자하나 잘못써서 30분 삽질한 문제 --; 너무 허무했다.
처음에 주사위를 어떻게 표현할지 고민을 했다. 1차원 배열로 해서 바닥면과 상위면을 INDEX로 관리할까 생각했는데 너무 복잡해보였고 그냥 주어진 그대로 2차원배열로 구현했다.
전체적인 과정은 아래와 같다.
동,서,남,북 방향에대해 실제 주사위를 굴리는것처럼 각 주사위 값을 변경해준다.
그 후 바닥값을 복사하고 상위면의 값을 출력하면 된다.
각 방향에 맞게 주사위를 굴리는걸 구현하는게 조금 헷갈렸다. 그거만 구현하니 나머지는 쉽게할 수 있었다.
#include <iostream>
#include <queue>
#include <math.h>
#include <set>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
#include <string.h>
using namespace std;
#define X first
#define Y second
int N, M;
pair <int, int> dicerc;
int dice[4][3] = { 0, };
int board[21][21];
int command;
void dice_swap(int dir)
{
if (dir == 1)
{
int temp = dice[1][2];
for (int i = 2; i > 0; i--)
{
dice[1][i] = dice[1][i - 1];
}
dice[1][0] = temp;
temp = dice[1][0];
dice[1][0] = dice[3][1];
dice[3][1] = temp;
}
else if (dir == 2)
{
int temp = dice[1][0];
for (int i = 0; i < 2; i++)
{
dice[1][i] = dice[1][i + 1];
}
dice[1][2] = temp;
temp = dice[1][2];
dice[1][2] = dice[3][1];
dice[3][1] = temp;
}
else if (dir == 3)
{
int temp = dice[0][1];
for (int i = 0; i < 3; i++)
{
dice[i][1] = dice[i+1][1];
}
dice[3][1] = temp;
}
else if (dir == 4)
{
int temp = dice[3][1];
for (int i = 3; i > 0; i--)
{
dice[i][1] = dice[i - 1][1];
}
dice[0][1] = temp;
}
}
void dice_copy()
{
if (board[dicerc.X][dicerc.Y] == 0)
{
board[dicerc.X][dicerc.Y] = dice[3][1]; //바닥면에 주사위 수 복사
}
else
{
dice[3][1] = board[dicerc.X][dicerc.Y];
board[dicerc.X][dicerc.Y] = 0;
}
}
int main()
{
cin.tie(0);
ios::sync_with_stdio(0);
cin >> N >> M >> dicerc.X >> dicerc.Y >> command;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
cin >> board[i][j];
}
}
//주사위 바닥면 (3,1) , 주사위 상단면 (1,1)
for (int i = 0; i < command; i++)
{
int temp;
cin >> temp;
if (temp == 1)
{
auto cur = dicerc;
int ny = cur.Y + 1;
if (ny < 0 || ny >= M) continue;
dicerc.Y += 1; //주사위 좌표 변경
dice_swap(1);
dice_copy();
}
else if (temp == 2)
{
auto cur = dicerc;
int ny = cur.Y - 1;
if (ny < 0 || ny >= M) continue;
dicerc.Y -= 1; //주사위 좌표 변경
dice_swap(2);
dice_copy();
}
else if (temp == 3)
{
auto cur = dicerc;
int nx = cur.X - 1;
if (nx < 0 || nx >= N) continue;
dicerc.X -= 1; //주사위 좌표 변경
dice_swap(3);
dice_copy();
}
else if (temp == 4)
{
auto cur = dicerc;
int nx = cur.X + 1;
if (nx < 0 || nx >= N) continue;
dicerc.X += 1; //주사위 좌표 변경
dice_swap(4);
dice_copy();
}
cout << dice[1][1] << '\n';
}
}
'알고리즘 풀이 > 시뮬레이션' 카테고리의 다른 글
BOJ : 16236 아기 상어 (0) | 2020.08.22 |
---|---|
BOJ : 16234 인구 이동 (0) | 2020.08.21 |
BOJ : 3190 뱀 (0) | 2020.08.20 |
BOJ : 14891 톱니바퀴 (0) | 2020.08.19 |
BOJ : 11559 Puyo Puyo (0) | 2020.08.19 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 그리디
- 시뮬레이션
- typeORM
- 중앙대학교
- 스레드
- Computer Architecture
- java
- nodeJS
- 예외처리
- 백준
- 투포인터
- ReactNative
- 벨만포드
- dfs
- 컴퓨터 통신
- BFS
- node.js
- nestjs
- 컴퓨터 구조
- 동적계획법
- boj
- nest.js
- 알고리즘
- 자바스크립트
- 세그먼트 트리
- 자바
- 재귀
- 구현
- 그래프
- 백트래킹
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함