Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 다익스트라
- dp
- Air Table
- 수학
- jpa
- REACT
- 컴퓨터 구조
- 삼성 SW 역량테스트
- LCS
- ICPC
- 그리디
- r
- 시뮬레이션
- Bit
- 데이터 분석
- Cloud Run
- 백준 1753번
- Cloud Pub/Sub
- 삼성SW역량테스트
- 접미사 배열
- BFS
- 고속 푸리에 변환
- 다이나믹 프로그래밍
- 펜윅 트리
- CI/CD
- 종만북
- 우선순위 큐
- 생활코딩
- JavaScript
- 이분탐색
Archives
- Today
- Total
코딩스토리
백준 14499번 - 주사위 굴리기 본문
백준 14499번 - 주사위 굴리기
https://www.acmicpc.net/problem/14499
이 문제는 시뮬레이션 문제이다.
주사위를 지도 안에서 굴리면서 윗면(바닥 면과 반대되는 면)을 출력하는 문제이다.
조건은 다음과 같다.
- 주사위를 굴렸을 때, 이동한 칸에 쓰여있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다.
- 0 이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0이 된다.
- 주사위는 지도 바깥으로 이동 불가하며 입력이 들어올 시 해당 입력 무시 및 출력 X
풀이법은 각 이동마다 주사위의 모든 면을 갱신시켜주는 것이 핵심이였다.
구현은 switch문을 통해 동, 서, 남, 북 이동시마다 주사위의 숫자들을 갱신시켰다.
방법은 예를 들어 동쪽으로 이동 시 (바닥면 기준 동,서,남,북 면으로 표현하였다)
바닥면 -> 기존 바닥면의 동쪽 면
윗면 -> 기존 바닥면의 서쪽 면
동쪽 면 -> 기존 바닥면의 윗 면
서쪽면 -> 기존 바닥면
남쪽 면 -> 기존 남쪽면
북쪽 면 -> 기존 북쪽면
이렇게 동, 서, 남, 북으로 이동 시 바뀌는 면들을 코드로 구현하였다.
처음에 문제에서 동, 서, 북, 남 순으로 제시했는데 잘못 읽어서 동, 서, 남, 북으로 표현했다가 시간을 낭비했다.
그리고 질문 검색판을 읽어보니 대부분의 틀린 사람들이 입력 받을 때 x,y를 반대로 입력 받지 않아서 틀렸다고 하던데
나는 처음부터 행렬로 생각하고 풀었기 때문에 x, y 입력에는 문제가 없었다.
(왜 y,x로 입력받아야 되는지 아직도 모르겠음 ㅎㅎ..)
코드는 다음과 같다.
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
|
#include <iostream>
#include <vector>
#pragma warning(disable:4996)
using namespace std;
int map[21][21];
int dx[4] = { 0,0, -1, 1 };
int dy[4] = { 1,-1,0,0 };
int main() {
int n, m, x, y, k;
scanf("%d %d %d %d %d", &n, &m, &x, &y, &k);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &map[i][j]);
}
}
vector<int>move(k);
for (int i = 0; i < k; i++) {
scanf("%d", &move[i]);
}
int cen = 0, north = 0, south = 0, east = 0, west = 0, top = 0;
int nx = x, ny = y;
for (int i = 0; i < k; i++) {
int now = move[i];
nx = nx + dx[now - 1];
ny = ny + dy[now - 1];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) {
nx = nx - dx[now - 1];
ny = ny - dy[now - 1];
continue;
}
int prev_cen = cen, prev_north = north, prev_south = south;
int prev_east = east, prev_west = west, prev_top = top;
switch (now) {
case 1:
cen = prev_east;
west = prev_cen;
east = prev_top;
top = prev_west;
break;
case 2:
cen = prev_west;
west = prev_top;
east = prev_cen;
top = prev_east;
break;
case 3:
cen = prev_north;
north = prev_top;
south = prev_cen;
top = prev_south;
break;
case 4:
cen = prev_south;
north = prev_cen;
south = prev_top;
top = prev_north;
break;
}
if (map[nx][ny] == 0) map[nx][ny] = cen;
else {
cen = map[nx][ny];
map[nx][ny] = 0;
}
printf("%d\n", top);
}
}
|
cs |
동, 서, 남, 북으로 이동 했을 때의 각 면의 숫자들의 변화만 잘 생각해서 짜면 쉽게 풀 수 있을 것이다.
'알고리즘 > 삼성 SW 역량테스트 기출 문제' 카테고리의 다른 글
백준 17144번 - 미세먼지 안녕! (0) | 2020.08.17 |
---|---|
백준 16235번 - 나무 재테크 (0) | 2020.08.15 |
백준 16236번 - 아기상어 (0) | 2020.08.13 |
백준 14503번 - 로봇 청소기 (0) | 2020.08.09 |
백준 3190번 - 뱀 (0) | 2020.08.06 |
Comments