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
- 그리디
- Web
- 코드 리뷰
- c++
- Level 2
- Level 3
- 구현
- 부스트코스
- 삼성 SW 역량 테스트
- 2019 KAKAO BLIND
- next_permutation
- BFS
- SWEA
- 백준
- 2020 KAKAO BLIND
- 시뮬레이션
- 브루트포스
- 2020 카카오 인턴십
- DFS
- pass
- 코드리뷰
- Level 4
- level 1
- 월간 코드 챌린지
- Gold 4
- 프로그래머스
- Gold 5
- 스택/큐
- DP
- 백트래킹
Archives
- Today
- Total
Min:D's Devlog
[백준][삼성 SW 역량 테스트][Gold 5][C++] 14499 주사위 굴리기 본문
문제
백준 삼성 SW 역량 테스트 기출 문제 - 14499 주사위 굴리기 (Gold 5)
문제 풀이
접근 방식
이 문제는 주사위를 규칙에 맞게 굴려 윗면의 수를 출력하는 시뮬레이션 문제였다.
우선, 아래의 전개도에 적혀 있는 숫자가 벡터의 인덱스를 의미하고,
인덱스 5가 주사위의 아래쪽인 dice 벡터를 만들어주었고, 모든 값을 0으로 초기화해주었다.
그리고 move 함수를 만들어 주사위를 이동시켜주고, 윗면의 숫자를 answer 벡터에 저장해주었다.
주사위는 항상 인덱스 5가 아래쪽을 의미하도록 고정해주었고,
이동할 때마다 다음과 같이 저장된 값을 이동시켜주며 주사위의 이동을 구현하였다.
이동을 완료한 후, 해당 위치의 map에 저장되어 있는 숫자가 0이면 map에 dice[5]의 값을 복사해주었고,
그렇지 않다면 dice[5]의 값을 map에 저장된 숫자로 바꿔주고, map의 숫자를 0으로 바꿔주었다.
그 후, 주사위의 위쪽의 숫자인 dice[2]의 값을 answer에 저장해주었다.
(map을 벗어나는 이동이면 아예 이동을 수행하지 않도록 구현하였다.)
모든 이동을 끝낸 후, answer에 저장된 값을 출력하여 문제를 해결하였다.
풀이 코드 - C++
#include <iostream>
#include <vector>
using namespace std;
vector<int> dice = { 0,0,0,0,0,0 };
int N, M, x, y, K;
vector<vector<int>> map;
int dirs[4][2] = { {0,1},{0,-1},{-1,0},{1,0} };
vector<int> answer;
void move(int dir) {
int nx = x + dirs[dir - 1][0];
int ny = y + dirs[dir - 1][1];
if (nx < 0 || nx >= N || ny < 0 || ny >= M) return;
x = nx; y = ny;
vector<int> temp = dice;
switch (dir) {
case 1:
temp[1] = dice[5];
temp[2] = dice[1];
temp[3] = dice[2];
temp[5] = dice[3];
dice = temp;
break;
case 2:
temp[1] = dice[2];
temp[2] = dice[3];
temp[3] = dice[5];
temp[5] = dice[1];
dice = temp;
break;
case 3:
temp[0] = dice[2];
temp[2] = dice[4];
temp[4] = dice[5];
temp[5] = dice[0];
dice = temp;
break;
case 4:
temp[0] = dice[5];
temp[2] = dice[0];
temp[4] = dice[2];
temp[5] = dice[4];
dice = temp;
break;
}
if (map[x][y] == 0) {
map[x][y] = dice[5];
}
else {
dice[5] = map[x][y];
map[x][y] = 0;
}
answer.push_back(dice[2]);
}
int main() {
cin >> N >> M >> x >> y >> K;
map.assign(N, vector<int>(M));
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 dir;
cin >> dir;
move(dir);
}
for (int i : answer)
cout << i << "\n";
}
실행 결과
'알고리즘 > 백준' 카테고리의 다른 글
[백준][삼성 SW 역량 테스트][Gold 3][C++] 17822 원판 돌리기 (0) | 2020.10.14 |
---|---|
[백준][삼성 SW 역량 테스트][Bronze 2][C++] 13458 시험 감독 (0) | 2020.10.12 |
[백준][삼성 SW 역량 테스트][Gold 5][C++] 14500 테트로미노 (0) | 2020.10.08 |
[백준][삼성 SW 역량 테스트][Gold 4][C++] 17140 이차원 배열과 연산 (0) | 2020.10.07 |
[백준][삼성 SW 역량 테스트][Silver 4][C++] 14501 퇴사 (0) | 2020.10.06 |
Comments